【问题标题】:Import Lib not working with exec function?导入库不能与 exec 函数一起使用?
【发布时间】:2021-09-12 11:45:35
【问题描述】:

我已经编写了以下代码字符串并尝试通过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"]

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

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?

【问题讨论】:

  • 请提供minimal reproducible example (MRE),以便没有所有与手头问题无关模块的人可以解决您的问题。
  • 好的,马蒂诺,让我更新一下。
  • @martineau,完成。请对此进行调查。

标签: python compilation exec lib


【解决方案1】:

终于找到解决办法了,

我在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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • @Nikk:我很好奇,你自己的答案没有用吗?
    • 我的答案工作正常......我也将它部署在 Prod 上。由于您的答案看起来也正确,因此我将您的答案标记为正确答案,因为我无法勾选自己的答案:) Stackoverflow 的事情..
    • 嗯,非常感谢你的手势——不过我相信你可以接受你自己的答案。也许在等待一段时间后。 IMO 你是两者中的佼佼者(我赞成)。
    猜你喜欢
    • 2013-11-18
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2020-09-18
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多