Python如何让导入模块继承主程序的函数与变量并正常执行
问题根因
Python中每个模块、函数都有独立的命名空间,默认不与主程序的全局作用域共享:
- 第一个示例中,
test函数定义在test_function.py模块内,查找变量a时优先读取自身模块的全局变量,你在主程序中修改的a属于主程序的命名空间,和模块内的a不是同一个对象,因此输出为1。 - 第二个示例中,导入
test_function.py时,模块会在自身的命名空间内查找test和a两个对象,主程序中定义的这两个对象不在模块作用域内,因此抛出NameError。
可用解决方案
方案1:用exec读取文件内容到当前作用域(最接近“同文件编写”的体验)
放弃import语法,直接用exec读取目标py文件的代码,在当前主程序的作用域内执行,即可完全共享所有变量和函数:
适配第一个示例
echo -e "a = 1\ndef test():\n print(a)" > test_function.py python3 -c "exec(open('test_function.py').read()); a = -1; test()" ## 输出:-1
适配第二个示例
echo "test(a)" > test_function.py python3 -c "a = 1\ndef test(a):\n print(a)\na=-1\nexec(open('test_function.py').read())" ## 输出:-1
方案2:同步命名空间(必须用import的场景)
如果必须使用import语法导入模块,可以手动将主程序的命名空间同步到导入的模块中:
import test_function import __main__ # 将主程序的所有变量、函数同步到导入的模块内 test_function.__dict__.update(__main__.__dict__) # 如果需要将模块内的内容也同步到主程序,补充执行下面的代码 __main__.__dict__.update(test_function.__dict__)
适配第一个示例
echo -e "a = 1\ndef test():\n print(a)" > test_function.py python3 -c "import test_function; a = -1; test_function.a = a; test_function.test()" ## 输出:-1
内容的提问来源于stack exchange,提问作者esp0xdeadbeef
相关产品推荐
相关产品推荐

