导入库不能与 exec 函数一起使用?

Posted

技术标签:

【中文标题】导入库不能与 exec 函数一起使用?【英文标题】:Import Lib not working with exec function? 【发布时间】: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,完成。请对此进行调查。 【参考方案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 上。由于您的答案看起来也正确,因此我将您的答案标记为正确答案,因为我无法勾选自己的答案:) *** 的事情.. 嗯,非常感谢你的手势——不过我相信你可以接受你自己的答案。也许在等待一段时间后。 IMO 你是两者中的佼佼者(我赞成)。

以上是关于导入库不能与 exec 函数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

bundle exec 不能与 crontab 一起使用

lastinsertId() 在与 exec() 一起工作时不能与 execute() 一起工作?

Jquery 库不能与 sencha touch 一起使用?

一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一)

让 QDialog 与 show 或 exec 函数一起显示

错误“不能将 'new' 与类型缺少调用或构造签名的表达式一起使用。”导入 Esri 类型时