Smu*_*oxo 3 python file exec python-3.x
我在 python 脚本中运行 python 脚本时遇到问题,我根本不明白:
假设我们在同一目录中有 2 个文件:'init.py' 和 'text.py'
初始化.py:
X = 5
print("init.py was run")
Run Code Online (Sandbox Code Playgroud)
测试.py:
exec(open("./init.py").read())
print("X = %s" %X)
Run Code Online (Sandbox Code Playgroud)
如果我现在运行 test.py,我会得到
init.py 已运行
X = 5
但是,如果我将 test.py 更改为:
def func_call( filename):
exec(open(filename).read())
print("X = %s" %X)
func_call("./init.py")
Run Code Online (Sandbox Code Playgroud)
我得到:
init.py 已运行
回溯(最近一次调用最后一次):
文件“test.py”,第 5 行,位于
Run Code Online (Sandbox Code Playgroud)func_call("./init.py")文件“test.py”,第 3 行,在 func_call 中
Run Code Online (Sandbox Code Playgroud)print("X = %s" %X)名称错误:名称“X”未定义
有人可以向我解释为什么这会导致不同的结果吗?有解决方法吗?我的目标是通过运行 python 脚本并访问该 python 脚本中设置的变量来初始化大部分变量。
如果 exec 获取两个单独的对象作为全局对象和局部对象,则代码将像嵌入在类定义中一样执行。
方法内部 globals() 和 locals() 是不同的对象:
def method():
print(globals() == locals())
exec('X=10')
print('Method execution =', X)
method()
Run Code Online (Sandbox Code Playgroud)
输出:
False
NameError: name 'X' is not defined
Run Code Online (Sandbox Code Playgroud)
在全局级别上,这些对象是相等的:
print(globals() == locals())
exec('X=99')
print('Global exec =', X)
Run Code Online (Sandbox Code Playgroud)
输出:
True
Global exec = 99
Run Code Online (Sandbox Code Playgroud)
因此,如果您想通过方法执行此操作,则需要将相同的对象传递给 exec。对于您的代码,它看起来像这样:
def func_call(filename):
exec(open(filename).read(), globals(), globals())
print("X = %s" %X)
func_call("./init.py")
Run Code Online (Sandbox Code Playgroud)
尽管如此,正如我在评论中提到的,使用 const 创建文件并导入它。尽量避免使用 exec/eval ,除非您 100% 确定自己在做什么。
| 归档时间: |
|
| 查看次数: |
7304 次 |
| 最近记录: |