相关疑难解决方法(0)

python exec()中的全局变量和本地变量

我正在尝试使用exec运行一段python代码.

my_code = """
class A(object):
  pass

print 'locals: %s' % locals()
print 'A: %s' % A

class B(object):
  a_ref = A
"""

global_env = {}
local_env = {}
my_code_AST = compile(my_code, "My Code", "exec")
exec(my_code_AST, global_env, local_env)

print local_env
Run Code Online (Sandbox Code Playgroud)

这导致以下输出

locals: {'A': <class 'A'>}
A: <class 'A'>
Traceback (most recent call last):
  File "python_test.py", line 16, in <module>
    exec(my_code_AST, global_env, local_env)
  File "My Code", line 8, in <module>
  File "My Code", line 9, in B
NameError: name 'A' is …
Run Code Online (Sandbox Code Playgroud)

python scope

35
推荐指数
2
解决办法
3万
查看次数

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

我在 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 行,位于

func_call("./init.py")   
Run Code Online (Sandbox Code Playgroud)

文件“test.py”,第 3 行,在 func_call 中

print("X = %s" %X) 
Run Code Online (Sandbox Code Playgroud)

名称错误:名称“X”未定义

有人可以向我解释为什么这会导致不同的结果吗?有解决方法吗?我的目标是通过运行 python 脚本并访问该 python 脚本中设置的变量来初始化大部分变量。

python file exec python-3.x

3
推荐指数
1
解决办法
7304
查看次数

标签 统计

python ×2

exec ×1

file ×1

python-3.x ×1

scope ×1