python 中如何导入一个自己创建的模块
导入模块的语句的三种方法:
1、import module
2、from module import name1,[name2,name3....]
3、from module import *
先看第一种方法:import module
首先我们导入一个已经安装过的三方库
import requests
当解释器在执行上面的语句时,会到搜索路径中去找该模块然后加载并执行。
在代码中使用模块的属性时需要使用完整的表示符名称(句点属性标识):
a=requests.post(.......)
下面我们来看自己定义的一个简单的模块(假如我们只需要一个简单的模块):
模块路径:prefix\lib\site-packages\subpath\testIm.py
因为我们自己定义一个模块不在python的搜索路径中因此,在导入时报错找不到该模块:ImportError: No module named testIM。
此时我们有2个办法解决:
1、将我们的模块testIm.py移动到搜索路径中去,比如prefix\lib\site-packages目录下
2、在搜索路径中添加模块所在的路径,因为当我们需要导入的模块位于系统的搜索路径下时,我们可以直接导入模块。
方法1、很简单,直接移动
模块名:testIm.py,代码如下:
1 class A(object): 2 def __init__(self,name,age): 3 print "A's initing" 4 self.name=name 5 self.age=age 6 def m_A(self): 7 print "m_A:name is %s " %self.name 8 print "m_A:age is %d " %self.age 9 10 class B(object): 11 def __init__(self,name,age): 12 print "B's initing" 13 self.name=name 14 self.age=age 15 def m_B(self): 16 print "m_B:name is %s" %self.name 17 print "m_B:age is %d" %self.age
现在我们来测试一下导入:
1 import testIm 2 a=testIm.A("anna",18) #输出结果为:A's initing 3 b=testIm.B("jim",21) #输出结果为:B's initing 4 a.m_A() #输出结果为:m_A:name is anna 5 #m_A:age is 18 6 b.m_B() #输出结果为:m_B:name is jim 7 #m_B:age is 21
发现没有报错了。
方法2、将prefix\lib\sit-packages\testImLib加入系统的搜索路径方法如下:
1 import sys
2 sys.path.append('C:\\Python27\\lib\\site-packages\\testImLib')
3 import testImNew
此时也没有报错了。
我们创建单个文件的情况并不能满足我们大部分时候的要求,更多的时候我们需要创建一个子目录,在子目录中组织我们的多个模块。如果我们导入自己创建的目录中的模块,我们就需要另一个文件的的帮忙才能正常导入我们的模块,这个文件及是__init__.py,或者也可以像前面那样,将我们创建的模块所在的路径加入到搜索路径中。如果只是单单在site-packages目录下创建了我们自己的目录,然后导入就会像前面一样报错。
对于添加目录到搜索路径,上面已经写出了方法,下面我说一下使用__init__.py进行导入。
假如在 prefix\lib\sit-packages目录下存在子目录testImLib,子目录包含testIm.py模块,即 有文件prefix\lib\sit-packages\testImLib\testIm.py
我们如果直接导入报错:
import testImLib.testIm #输出结果为: ImportError: No module named testImLib.testIm
在子目录testImLib中引入__init__.py文件。__init__.py文件引入后testImLib就相当于是一个合法的包了。
prefix\lib\sit-packages\testImLib\中包含:__init__.py、testIm.py2个文件。__init__.py文件可以为空,也可以写入我们要的内容。
添加__init__.py文件后我们测试一下:
if __name__=="__main__": from testImLib import testIm a=testIm.A("anna",18) #输出结果为:A's initing
到此,顺利解决。
总结一下:
当我们创建了一个模块需要导入时,当此模块文件在系统的搜索路径下,可以直接导入;如果不在,则可以通过她添加模块所在路径到系统的搜索路径中去。
当我们创建了一个包时,一定需要__init__.py文件,这样才是一个合法的包。我们可以直接通过 from *** import ***来导入。或者我们也可以不要__init__.py文件直接将包的路径添加到搜索路径中。
基于目前的水平,可能文章中有错误或者不够清晰的地方,以后再完善。