gpt4 book ai didi

python - 导入模块 : __main__ vs import as module

转载 作者:行者123 更新时间:2023-12-04 16:52:23 24 4
gpt4 key购买 nike

作为序言,我想我可能已经弄清楚如何让这段代码工作(基于 Changing module variables after import),但我的问题实际上是关于为什么会发生以下行为,以便我了解将来不应该做什么。

我有三个文件。第一个是 mod1.py:

# mod1.py

import mod2

var1A = None

def func1A():
global var1
var1 = 'A'
mod2.func2()

def func1B():
global var1
print var1

if __name__ == '__main__':
func1A()

接下来我有 mod2.py:
# mod2.py

import mod1

def func2():
mod1.func1B()

最后我有driver.py:
# driver.py

import mod1

if __name__ == '__main__':
mod1.func1A()

如果我执行命令 python mod1.py那么输出是 None .根据我上面引用的链接, mod1.py 之间似乎有些区别被导入为 __main__mod1.pymod2.py 进口.因此,我创建了 driver.py .如果我执行命令 python driver.py然后我得到预期的输出: A .我有点看到差异,但我并没有真正看到机制或原因。这是如何以及为什么会发生的?同一个模块会存在两次似乎有悖常理。如果我执行 python mod1.py , 是否可以访问 __main__ 中的变量? mod1.py 的版本而不是 mod2.py 导入的版本中的变量?

最佳答案

__name__变量始终包含模块的名称,除非文件已作为脚本加载到解释器中。然后将该变量设置为字符串 '__main__'反而。

毕竟,脚本然后作为整个程序的主文件运行,其他所有内容都是由该主文件直接或间接导入的模块。通过测试 __name__变量,因此您可以检测文件是否已作为模块导入或直接运行。

在内部,模块被赋予一个命名空间字典,它作为每个模块元数据的一部分存储在 sys.modules 中。 .主文件,即执行的脚本,存储在与 '__main__' 相同的结构中。 .

但是当你将一个文件作为模块导入时,python首先在sys.modules中查找查看该模块之前是否已导入。所以,import mod1意味着我们首先查看 sys.modulesmod1模块。如果 mod1,它将创建一个带有命名空间的新模块结构还没有。

所以,如果你们都运行 mod1.py作为主文件,然后将其作为 python 模块导入,它会在 sys.modules 中获得两个命名空间条目.一为'__main__' ,然后是 'mod1' .这两个命名空间是完全独立的。您的全局var1存储在 sys.modules['__main__'] , 但是 func1B正在寻找 sys.modules['mod1']var1 ,它在哪里None .

但是当你使用 python driver.py , driver.py成为 '__main__'程序的主文件,以及 mod1将仅导入一次 sys.modules['mod1']结构体。这一次,func1A专卖店 var1sys.modules['mod1']结构,这就是func1B会发现。

关于python - 导入模块 : __main__ vs import as module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13709011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com