可以使用import导入包或模块。模块(module)通常为一个文件,可以作为module的文件类型有py、pyo、pyc、pyd、so、dll。包通常是一个目录,包的目录下必须创建一个文件__init__.py。
系统在导入模块时,要做以下几件事:
1. 为模块中的定义的对象创建一个名字空间。
2. 在新的名字空间里执行源代码文件。
3. 创建源代码文件的对象,该对象引用模块的名字空间。
使用from语句会将模块中的对象直接导入到当前的名字空间,不会创建一个到模块名字空间的引用。
from socket import gethostname
print gethostname() # 直接调用
socket.gethostname() # 引发异常 NameError: socket
可以使用*号导入模块中除下划线开头的所有对象,不过如果模块定义了__all__,则只会导入__all__列表中的对象。
import语句可以在程序的任何位置使用,可以多次导入同一个模块,但模块的代码仅在首次导入时执行,后面的import语句只是创建一个到模块名字空间的下引用。sys.modules保存了所有被导入模块的映射,系统根据sys.modules来决定是否需要导入一个模块。
由于存在作用域冲突,不允许在函数中使用from语句。
模块搜索路径,sys.path
可以被import语句导入的模块有以下四类:
.py文件
C或C++扩展(已编译为共享库或DLL文件)
包
内建模块(使用C编写并已链接到Python解释器内)
查询模块的顺序
当查询模块foo时,解释器按以下顺序查找:
1. 定义为一个包的目录foo
2. foo.so, foomodule.so, foomodule.sl 或 foomodule.dll
3. foo.pyo(只在使用-O 或 -OO选项时)
4. foo.pyc
5. foo.py
import语句导入模块
import Graphics.Primitive.fill 导入模块Graphics.Primitive.fill,只能以全名访问模块属性,例如 Graphics.Primitive.fill.floodfill(img, x, y, color)。
from Graphics.Primitive import fill 导入模块fill,只能以fill.属性名这种方式访问模块属性,例如fill.floodfill(img, x, y, color)。
from Graphics.Primitive import floodfill 将函数floodfill 放到当前的名字空间,直接访问导入的属性,例如floodfill(img, x, y, color)。
sys.path 和 sys.modules
sys.path包含了module的查找路径
sys.modules是包含了当前所有已加载模块的字典