import
有以下几种import方式:
-
import X: 导入module X,并在当前的名字空间创建引用指向该module对象。
-
**from X import ** 导入module X,module X 中除了名称以下划线开头的对象和没在__all__列表中出现的对象外,module中的所有其它对象在当前名字空间中创建引用,指向该对象。
-
from X import a, b, c 导入module X,并在当前命名空间中创建导入对象的引用。
-
__import__
import 过程:
- 在sys.module列表中查看module是否已被import,如果已经import,则使用现在存在的引用;reload会重新import 模块;
- 创建module对象;
- 将新创建的对象加入sys.module列表中;
- 编译module文件,加载(load)对象;
- 在module的命名空间下执行module文件。
循环import
# X.py
import Y #(1)
def spam(): #(2)
print 'function in module X'
# Y.py
from X import spam #(3)
执行import X:当执行到(1)时,转而去执行Y.py,当执行到(3)时,此时X虽然在sys.module中注册,但是还没有属性spam,报错。 执行import Y:当执行到(3)时,转而执行X.py,执行(2)时,因为Y已经存在,无需重新import,顺利执行成功。
当以脚本的方式运行X.py/Y.py时,因为以脚本执行时,module名字是__main__,而不是X/Y,结果Y报错,X执行成功。
当出现循环import时,尽量把import语句写在后面,如X.py将import Y放在最后,就不会出错了。 package
package是一个目录,里面有一个__init__.py文件,当导入package时,__init__.py在package的名字空间下被执行。