Python exec() 中的函数未添加到 globals/locals dict
Python functions in exec() not being added to globals/locals dict
我正在使用 python 的 exec()
函数。我正在尝试导入一个模块并定义一个在一个 exec()
调用中使用该模块的函数,然后从另一个 exec()
调用中调用该函数。
像这样:
code1 = "import time
def foo(i):
time.sleep(1)
print(i)"
code2 = "foo('hello')"
custom_globals, custom_locals = {}, {}
exec(code1, custom_globals, custom_locals)
exec(code2, custom_globals, custom_locals)
但是,当我 运行 这段代码时,我得到错误 name 'time' is not defined
。这真的很令人困惑,因为如果我执行以下任一操作:
- 将
code2
的值设置为 time.sleep(1)
- 将 foo 的代码设置为
print(i)
(没有 time
调用)
脚本将无误地执行。我对 exec()
有什么误解吗?我知道导入的模块存储在 globals/locals
中,但我想我不太确定方法。我在这里做错了什么?
编辑:在第一个 exec()
调用之后,custom_globals
有它的默认值并且 custom_locals
看起来像这样:
{'time': <module 'time' (built-in)>, 'foo': <function foo at 0xa159968c0>}
每个 @juanpa.arrivillaga 的解决方案是只使用一个 vars dict 而不是 global
dict 和 local
dict,因为“如果 exec 得到两个单独的对象作为全局变量和局部变量, 代码将被执行,就像它嵌入在 class 定义中一样。"
我正在使用 python 的 exec()
函数。我正在尝试导入一个模块并定义一个在一个 exec()
调用中使用该模块的函数,然后从另一个 exec()
调用中调用该函数。
像这样:
code1 = "import time
def foo(i):
time.sleep(1)
print(i)"
code2 = "foo('hello')"
custom_globals, custom_locals = {}, {}
exec(code1, custom_globals, custom_locals)
exec(code2, custom_globals, custom_locals)
但是,当我 运行 这段代码时,我得到错误 name 'time' is not defined
。这真的很令人困惑,因为如果我执行以下任一操作:
- 将
code2
的值设置为time.sleep(1)
- 将 foo 的代码设置为
print(i)
(没有time
调用)
脚本将无误地执行。我对 exec()
有什么误解吗?我知道导入的模块存储在 globals/locals
中,但我想我不太确定方法。我在这里做错了什么?
编辑:在第一个 exec()
调用之后,custom_globals
有它的默认值并且 custom_locals
看起来像这样:
{'time': <module 'time' (built-in)>, 'foo': <function foo at 0xa159968c0>}
每个 @juanpa.arrivillaga 的解决方案是只使用一个 vars dict 而不是 global
dict 和 local
dict,因为“如果 exec 得到两个单独的对象作为全局变量和局部变量, 代码将被执行,就像它嵌入在 class 定义中一样。"