可以使用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是包含了当前所有已加载模块的字典