Python3在函数内部调用exec(open().read())时出现问题
我在python脚本中运行python脚本时遇到了一个问题,我根本不理解: 假设我们在同一目录中有两个文件:“init.py”和“text.py” init.py:Python3在函数内部调用exec(open().read())时出现问题,python,python-3.x,file,exec,Python,Python 3.x,File,Exec,我在python脚本中运行python脚本时遇到了一个问题,我根本不理解: 假设我们在同一目录中有两个文件:“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
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")
func_调用中第3行的文件“test.py”
print("X = %s" %X)
名称错误:未定义名称“X”
有人能给我解释一下为什么这会导致不同的结果吗?
有解决办法吗?
我的目标是通过运行python脚本并访问在该python脚本中设置的变量来初始化大多数变量。根据:
如果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")
然而,正如我在评论中提到的,用常量创建文件并导入它。尽可能避免使用exec/eval,除非您100%确定自己在做什么。为什么不创建文件
const.py
并导入它?这确实有效,解决了问题,谢谢!然而,我仍然不明白为什么会发生这种情况……另请参见和