我通过修改主模块中的全局值来切换程序模式。
更改反映在源于该模块内部的以下函数调用中,但不会在其他模块调用相同函数时反映。
当函数调用来自外部时,主模块是否使用旧/外部/重复值?
main_module.py
import second_module
mode = 1
def print_mode():
print 'Mode: ' + str(mode)
if __name__ == "__main__":
print_mode()
mode = 2
print_mode()
second_module.problem()
second_module.py
from main_module import print_mode
def problem():
print_mode()
输出
$ python main_module.py
Mode: 1
Mode: 2
Mode: 1
答案 0 :(得分:2)
您在命令行提供的文件作为名为__main__
的模块执行(__name__ == '__main__'
条件依赖于此)。模块通常只导入一次,未来的导入会提供对同一模块名称的另一个引用。
但是,此机制基于模块名称。 from main_module import print_mode
查找名为main_module
的模块,但是还没有这样的模块,因此再次加载文件并创建一个名为main_module
的单独模块。这需要再次执行来自main_module.py
的代码,这再次初始化mode = 1
,但确实没有达到上述条件,因此没有做任何其他事情(例如mode = 2
)。
所以你最终得到了三个模块:__main__
,second_module
和main_module
。 __main__.mode == 2
,main_module.mode == 1
和second_module.print_mode is main_module.print_mode
,因此print_mode
中的second_module
来电是main_module.mode
,即{2}。
简单的方法是在__main__
中没有任何逻辑:将您的入口点放在main()
中的函数main_module.py
中,然后创建一个单独的脚本,该脚本不执行任何其他操作而不是导入main_module
并致电main_module.main()
。或者,不要使用全局变量; - )