首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中使用execfile的NameError

在python中使用execfile的NameError
EN

Stack Overflow用户
提问于 2009-05-28 20:07:09
回答 4查看 8.7K关注 0票数 4

我的应用程序有一个按钮可以使用execfile动态执行python脚本。如果我在脚本中定义一个函数(例如。并尝试在另一个函数中使用该函数(例如。鸡蛋(),我得到这个错误:

代码语言:javascript
运行
复制
NameError: global name 'spam' is not defined

从蛋清()内部调用垃圾邮件()函数的正确方法是什么?

代码语言:javascript
运行
复制
#mainprogram.py
class mainprogram():
    def runme(self):
        execfile("myscript.py")

>>> this = mainprogram()
>>> this.runme()

# myscript.py
def spam():
    print "spam"

def eggs():
    spam()

eggs()

而且,我似乎无法从脚本中的主应用程序中执行方法。即

代码语言:javascript
运行
复制
#mainprogram.py
class mainprogram():
    def on_cmdRunScript_mouseClick( self, event ):
        execfile("my2ndscript.py")
    def bleh():
        print "bleh"

 #my2ndscript.py
 bleh()

错误是:

代码语言:javascript
运行
复制
NameError: name 'bleh' is not defined

从my2ndscript.py调用bleh()的正确方法是什么?

编辑:更新的第一期

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-29 09:23:23

在第二种情况下,您将需要import (不确定"mainprogram.py“是否在$PYTHONPATH上)

代码语言:javascript
运行
复制
#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的第二个实例。或者,更好的是:

代码语言:javascript
运行
复制
#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(),以防脚本在这些单击之间发生变化)?

代码语言:javascript
运行
复制
#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()
票数 2
EN

Stack Overflow用户

发布于 2013-02-06 05:38:23

自从你发帖以来,你已经有了3年8个月的智慧,所以我想你应该已经找到了第一个问题,但是考虑到一个解决方案还没有发布(主要是因为似乎没有人对第一个问题有问题),下面是我的解决方案。

已更新

我提供的最后一个解决方案是不正确的。下面,我将提供正确的解决方案,并使用我执行的代码详细解释它。

这个问题是Python的execfile() 内置的固有问题。这是这个函数在Python3.x.中被废弃的原因之一。

当您在runme()中执行runme()时,对象spam()eggs()被加载到方法runme()的命名空间中,而不是全局命名空间(理想情况下应该是这样)。

myscript.py

代码语言:javascript
运行
复制
def spam():
    print 'spam'

def eggs():
    if 'spam' not in globals():
        print 'method spam() is not present in global namespace'
    spam()

try:
    eggs()
except Exception as e:
    print e

mainprogram.py

代码语言:javascript
运行
复制
class mainprogram():
    def runme(self):
        execfile("myscript.py")
        print 'Objects lying in local namespace of runme() are -'
        print locals()

this = mainprogram()
this.runme()

解释器输出

代码语言:javascript
运行
复制
>>>import mainprogram
method spam() is not present in global namespace
name 'spam' is not defined
Objects lying in local namespace of runme() are -
{'e': NameError("name 'spam' is not defined",), 'spam': <function spam at 0x000000000000002B>, 'eggs': <function eggs at 0x000000000000002C>, 'self': <mainprogram.mainprogram instance at 0x000000000000002D>}

从输出中可以看到,spam()不是在全局命名空间中,而是在方法runme()的命名空间中。

代码语言:javascript
运行
复制
def eggs():
    global this
    this.runme.spam()

但是,当spam()位于runme()的名称空间中时,无法访问它。因此,解决方案是在全局命名空间中插入spam(),如下所示:

myscript.py

代码语言:javascript
运行
复制
global spam
def spam():
    print "spam"

def eggs():
    spam()

eggs()

这将确保在spam()字典(即全局命名空间)中创建对对象globals()的引用,使其可以从eggs()调用。

票数 10
EN

Stack Overflow用户

发布于 2013-12-09 16:38:09

Addy689解释了真正的问题:它是在从函数调用execfile() 时出现的。execfile()在全局空间运行良好。这就是为什么答案常常是“对我来说是有效的”。

但是修改被调用的脚本的解决方案可能是不可能的。因此,我在这里报告了我认为最好的解决方案,在exec()函数的另一个等价问题上找到了最好的解决方案(在文章中:https://stackoverflow.com/a/11754346/1808778)。它与execfile()一样工作。

代码语言:javascript
运行
复制
def callingFunction(filename)
    # ... 
    d = dict(locals(), **globals())
    execfile(filename, d, d )

该解决方案的优点是我们不需要知道被调用的脚本:执行的是在if name == main中命名的函数。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/922897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档