在python中使用execfile的NameError

发布于 2021-01-29 16:52:08

我的应用程序有一个按钮,可以使用 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() 的正确方法是什么? __

编辑 :更新第一期

关注者
0
被浏览
38
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在第二种情况下,您将需要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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看