<p>你已经3年8个月大了,所以我假设你已经解决了第一个问题,但是考虑到一个解决方案还没有发布(主要是因为没有人对第一个问题有意见),下面是我的解决方案。</p>
<h2>[更新]</h2>
<p>我提供的最后一个解决方案是不正确的。下面我将提供正确的解决方案,并使用我执行的代码详细解释它。</p>
<p><strong>这个问题是Python内置的<code>execfile()</code>固有的。这也是Python 3.x中函数被弃用的原因之一。</strong></p>
<p>当您在<code>runme()</code>内部执行<code>execfile()</code>时,对象<code>spam()</code>和<code>eggs()</code>被加载到方法<code>runme()</code>的命名空间中,而不是全局命名空间中(理想情况下应该是这样)</em>。请考虑以下代码:</p>
<h2>myscript.py</h2>
<pre><code>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
</code></pre>
<h2>主程序.py</h2>
<pre><code>class mainprogram():
def runme(self):
execfile("myscript.py")
print 'Objects lying in local namespace of runme() are -'
print locals()
this = mainprogram()
this.runme()
</code></pre>
<h2>解释器输出</h2>
<pre><code>>>>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>}
</code></pre>
<p>从输出中可以看到<code>spam()</code>不在全局命名空间中,而在方法<code>runme()</code>的命名空间中。所以假设,正确的调用<code>spam()</code>的方法应该是</p>
<pre><code>def eggs():
global this
this.runme.spam()
</code></pre>
<p>但是,当它位于<code>runme()</code>的命名空间中时,无法访问<code>spam()</code>。因此,解决方案是在全局命名空间中插入<code>spam()</code>,如下所示:</p>
<h2>myscript.py</h2>
<pre><code>global spam
def spam():
print "spam"
def eggs():
spam()
eggs()
</code></pre>
<p>这将确保在<code>globals()</code>字典(即全局命名空间)中创建对对象<code>spam()</code>的引用,使其可从<code>eggs()</code>调用。</p>