我遇到了在python脚本中运行python脚本的问题,我根本不理解:
假设我们在同一目录中有2个文件:' init.py'和' text.py'
init.py:
X = 5
print("init.py was run")
test.py:
exec(open("./init.py").read())
print("X = %s" %X)
如果我现在运行test.py,我会
运行了init.py
X = 5
但是,如果我将test.py更改为:
def func_call( filename):
exec(open(filename).read())
print("X = %s" %X)
func_call("./init.py")
我明白了:
运行了init.py
追踪(最近一次呼叫最后一次):
文件" test.py",第5行,
func_call("./init.py")
文件" test.py",第3行,在func_call
中print("X = %s" %X)
NameError:name' X'未定义
有人可以向我解释为什么会导致不同的结果吗? 这有解决方法吗? 我的目标是通过运行python脚本并访问在该python脚本中设置的变量来初始化我的大多数变量。
答案 0 :(得分:4)
如果exec获得两个单独的对象作为全局变量和局部变量,则代码将被执行,就好像它嵌入在类定义中一样。
内部方法globals()和locals()是不同的对象:
def method():
print(globals() == locals())
exec('X=10')
print('Method execution =', X)
method()
输出:
False
NameError: name 'X' is not defined
在全球范围内,这些对象是相同的:
print(globals() == locals())
exec('X=99')
print('Global exec =', X)
输出:
True
Global exec = 99
所以如果你想通过方法来做,你需要将同一个对象传递给exec。对于您的代码,它看起来像这样:
def func_call(filename):
exec(open(filename).read(), globals(), globals())
print("X = %s" %X)
func_call("./init.py")
然而,正如我在评论中提到的,创建带有consts的文件并导入它。尽量避免不惜一切代价使用exec / eval,除非你100%确定自己在做什么。