Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3在函数内部调用exec(open().read())时出现问题_Python_Python 3.x_File_Exec - Fatal编程技术网

Python3在函数内部调用exec(open().read())时出现问题

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

我在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):
  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
并导入它?这确实有效,解决了问题,谢谢!然而,我仍然不明白为什么会发生这种情况……另请参见和