Import Lib 不适用于 exec 函数?

Import Lib not working with exec function?

我已经编写了以下代码字符串并尝试通过 exec 方法执行它。当我 运行 仅使用全局模式时,这段代码 运行 没问题。

codeRule = """import math
def fun (n):
    data = n
    data = data * math.pi
    print(data)
    return data
dd = fun(n)"""
    
codeObejct = compile(codeRule, 'sumstring', 'exec')
exec(codeObejct, dict(n = 10))

但是我的用例需要 exec 之外的 dd 值,所以我使用下面的参数在另一个数据帧中获取 dd 值。

loc = {}
exec(codeObejct, dict(n = 10), loc)
dd = loc["dd"]

但是一旦我使用本地,它就开始给我一个关于库导入的错误,例如

File "<stdin>", line 1, in <module>
  File "sumstring", line 7, in <module>
  File "sumstring", line 4, in fun
NameError: name 'math' is not defined

有人可以帮忙解决这个问题吗?

我已经检查了以下问题的答案,但我不知道如何将其适合我的用例。

Why doesn't an import in an exec in a function work?

终于找到解决办法了,

exec 我少了一分。以下是我得到的解决方案,我希望它适用于我的实际用例

codeRule = """import math
def fun (n):
    data = n
    data = data * math.pi
    return data
"""
#export Function 
exec (codeRule, globals())

dd = fun(10)
dd
31.41592653589793

你的 看起来不错。如果您的用例需要回退,这是另一种更复杂的方法:

codeRule = """\
import math

def fun(n):
    data = n
    data = data * math.pi
    return data

loc['dd'] = fun(n)
"""

codeObject = compile(codeRule, 'sumstring', 'exec')
loc = {}
exec(codeObject, dict(n=10, loc=loc))
print(f"{loc['dd']=}")  # -> loc['dd']=31.41592653589793