在python中使用execfile的NameError
我的应用程序有一个按钮,可以使用 execfile 动态执行python脚本。如果我在脚本内定义一个函数(例如 spam()
)并尝试在另一个函数内使用该函数(例如 egg() ),则会出现此错误:
NameError: global name 'spam' is not defined
从 egg() 内部调用 spam() 函数的正确方法是什么? __
#mainprogram.py
class mainprogram():
def runme(self):
execfile("myscript.py")
>>> this = mainprogram()
>>> this.runme()
# myscript.py
def spam():
print "spam"
def eggs():
spam()
eggs()
另外,我似乎无法从脚本中的主应用程序执行方法。即
#mainprogram.py
class mainprogram():
def on_cmdRunScript_mouseClick( self, event ):
execfile("my2ndscript.py")
def bleh():
print "bleh"
#my2ndscript.py
bleh()
错误是:
NameError: name 'bleh' is not defined
从 my2ndscript.py 调用 bleh() 的正确方法是什么? __
编辑 :更新第一期
-
在第二种情况下,您将需要
import
(不确定“ mainprogram.py”是否在您的上$PYTHONPATH
)#mainprogram.py class mainprogram: def runme(self): execfile("my2ndscript.py") def bleh(self): print "bleh" if __name__ == '__main__': mainprogram().runme() #my2ndscript.py import mainprogram x = mainprogram.mainprogram() x.bleh()
但这会创建的第二个实例
mainprogram
。或者,更好的是:#mainprogram.py class mainprogram: def runme(self): execfile("my2ndscript.py", globals={'this': self}) def bleh(self): print "bleh" if __name__ == '__main__': mainprogram().runme() #my2ndscript.py this.bleh()
我想这毕竟
execfile
不是解决您问题的正确方法。您为什么不使用import
或__import__
(并且reload()
如果脚本在两次点击之间发生变化)?#mainprogram.py import my2ndscript class mainprogram: def runme(self): reload(my2ndscript) my2ndscript.main(self) def bleh(self): print "bleh" if __name__ == '__main__': mainprogram().runme() #my2ndscript.py def main(program): program.bleh()