Python exec 在通过函数调用时未获取作用域
Python exec not picking up scope when called via a function
我有一个函数 test()
可以检查字符串是否是有效的 Python 文件。 (字符串通常是从自述文件中提取的。)字符串上的 运行 exec()
效果很好,除非在这种情况下:
string = """
import math
def f(x):
return math.sqrt(x)
f(2.0)
"""
# no problem:
# exec(string)
def test():
exec(string)
test() # NameError: name 'math' is not defined
Traceback (most recent call last):
File "d.py", line 17, in <module>
test()
File "d.py", line 15, in test
exec(string)
File "<string>", line 7, in <module>
File "<string>", line 5, in f
NameError: name 'math' is not defined
为什么如果通过函数调用 exec()
不接收 import math
,但当 运行 它在主作用域中时有效?如何在 test()
内解决它?
解释起来有点困难,但如果你这样做就可以了:
def test():
exec(string, {"__MODULE__": "__main__"})
基本上,import math
不存在于 f
函数中,除非它在主作用域中声明。
我有一个函数 test()
可以检查字符串是否是有效的 Python 文件。 (字符串通常是从自述文件中提取的。)字符串上的 运行 exec()
效果很好,除非在这种情况下:
string = """
import math
def f(x):
return math.sqrt(x)
f(2.0)
"""
# no problem:
# exec(string)
def test():
exec(string)
test() # NameError: name 'math' is not defined
Traceback (most recent call last):
File "d.py", line 17, in <module>
test()
File "d.py", line 15, in test
exec(string)
File "<string>", line 7, in <module>
File "<string>", line 5, in f
NameError: name 'math' is not defined
为什么如果通过函数调用 exec()
不接收 import math
,但当 运行 它在主作用域中时有效?如何在 test()
内解决它?
解释起来有点困难,但如果你这样做就可以了:
def test():
exec(string, {"__MODULE__": "__main__"})
基本上,import math
不存在于 f
函数中,除非它在主作用域中声明。