KL.*_*KL. 29 python import module
在编写python模块时,有没有办法防止它被客户端代码导入两次?就像c/c ++头文件一样:
#ifndef XXX
#define XXX
...
#endif
Run Code Online (Sandbox Code Playgroud)
非常感谢!
Nou*_*him 40
Python模块不会多次导入.只运行两次导入将不会重新加载模块.如果要重新加载它,则必须使用该reload语句.这是一个演示
foo.py 是一个单行模块
print "I am being imported"
Run Code Online (Sandbox Code Playgroud)
这是一个多次导入尝试的屏幕记录.
>>> import foo
Hello, I am being imported
>>> import foo # Will not print the statement
>>> reload(foo) # Will print it again
Hello, I am being imported
Run Code Online (Sandbox Code Playgroud)
Yoe*_*oel 15
正如其他答案中所指出的,Python在遇到第二个import语句时通常不会重新加载模块.相反,它返回其缓存版本sys.modules而不执行任何代码.
然而,有几个值得注意的陷阱:
将主模块作为普通模块导入,可以有效地创建不同名称下同一模块的两个实例.
这是因为在程序启动期间,主模块设置了名称__main__.因此,当将其作为普通模块导入时,Python不会检测到它sys.modules并再次导入它,但是第二次使用其正确的名称.
考虑文件/tmp/a.py,其中包含以下内容:
# /tmp/a.py
import sys
print "%s executing as %s, recognized as %s in sys.modules" % (__file__, __name__, sys.modules[__name__])
import b
Run Code Online (Sandbox Code Playgroud)
另一个文件/tmp/b.py有一个针对a.py(import a)的import语句.
执行/tmp/a.py会产生以下输出:
root@machine:/tmp$ python a.py
a.py executing as __main__, recognized as <module '__main__' from 'a.py'> in sys.modules
/tmp/a.pyc executing as a, recognized as <module 'a' from '/tmp/a.pyc'> in sys.modules
Run Code Online (Sandbox Code Playgroud)
因此,最好将主模块保持在相当小的范围,并将其大部分功能导出到外部模块,如此处所述.
此答案指定了另外两种可能的情况:
sys.path导致同一模块使用不同条目的导入语句略有不同.