该
__name__变量总是包含模块的名称, 除非 当该文件已被加载到解释作为脚本来代替。 然后 将该变量设置为字符串
'__main__'。
毕竟,脚本随后将作为整个程序的主文件运行,其他所有内容都是由该主文件直接或间接导入的模块。通过测试
__name__变量,您可以因此检测文件是作为模块导入的还是直接运行的。
在内部,为模块提供了一个命名空间字典,该字典作为每个模块的元数据的一部分存储在中
sys.modules。主文件(已执行的脚本)的存储结构与相同
'__main__'。
但是,当您将文件导入为模块时,python首先
sys.modules查看该模块是否已经导入。因此,
importmod1意味着我们首先寻找
sys.modules该
mod1模块。如果
mod1还没有命名空间,它将创建一个新的模块结构。
因此,如果您都
mod1.py作为主文件运行, 然后 又将其作为python模块导入,则它将在中获得 两个
名称空间条目
sys.modules。一次为
'__main__',然后为
'mod1'。这两个名称空间是完全分开的。您的全球
var1存储在
sys.modules['__main__'],但
func1B期待中
sys.modules['mod1']的
var1,它在哪里
None。
但是,当您使用时
pythondriver.py,它将成为程序
driver.py的
'__main__'主文件,并且
mod1只会被导入到
sys.modules['mod1']结构中一次。这次,
func1A将其存储
var1在
sys.modules['mod1']结构中,这
func1B将是发现的。



