我有一个函数,当被调用时,应该使用exec定义另一个函数,并使这个新函数可用于主程序。我们的目标如下。
主程序:
#!/usr/bin/python
from ext import makeF
makeF()
sayA()外部模块:
def makeF():
script="def sayA():\n\tprint 'Aah'"
exec(script)
sayA()
return我想要的是能够从主程序调用内部函数sayA(),因此在这个示例中,输出应该是
Aah
Aah但它却回来了
Aah
Traceback (most recent call last):
File "mwe.py", line 5, in <module>
sayA()
NameError: name 'sayA' is not defined这是我所期望的,所以我用exec(script,globals)代替了exec(script,globals),根据文档,但是我得到
Traceback (most recent call last):
File "mwe.py", line 4, in <module>
makeF()
File "/home/tomas/tests/ext.py", line 3, in makeF
exec(script,globals,locals)
TypeError: exec: arg 2 must be a dictionary or None我觉得我漏掉了一些很明显的东西,但我搞不懂。任何帮助都是非常感谢的。
谢谢。
发布于 2015-04-23 02:06:49
您已经在makeF中创建了函数,因此它在函数外部的外部模块的作用域中都是不可见的。
如果您想从main调用它,return sayA:
def makeF():
script="def sayA():\n\tprint('Aah')"
exec(script)
return sayA然后主要是:
f = makeF()
f()要在python3中获得相同的行为,其中exec不再是语句而是函数,可以使用带有dict的lambda:
def makeF():
d = {}
"sayA = lambda: print('Aah')"
exec("sayA = lambda: print('Aah')",d)
return d["sayA"]
from ext import makeF
f = makeF()
f()发布于 2015-04-23 02:12:40
全局和局部变量()是函数,而不是字典(尽管它们返回字典)。
而且,您试图调用它的方式是,sayA是在局部变量()中定义的。别管那个了。
我的版本:
def makeF():
script="def sayA():\n\tprint 'Aah'"
#exec script in globals()
exec(script, globals())
#exec(script, globals(), locals())
sayA()
print globals()
print locals()
makeF()
sayA()试着用注释的行来对比。
https://stackoverflow.com/questions/29812241
复制相似问题