导入库不能与 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 函数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
lastinsertId() 在与 exec() 一起工作时不能与 execute() 一起工作?
Jquery 库不能与 sencha touch 一起使用?
一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一)