<h2>tl,dr:条件块并不重要。它们没有自己的名称空间,因此该异常还有其他原因</h2>
<p>Python的条件块没有单独的名称空间。您可以访问条件块中定义的任何变量,就像它们是在常规程序流中定义的一样。如果条件没有命中,并且您试图访问一个变量,那么解释器将引发NameError。所以你可以这么做:</p>
<pre><code>if command == '/starttest1':
extProc = sp.Popen(['python','haha.py'])
elif command == '/stoptest1':
sp.Popen.terminate(extProc)
print("haha.py has been closed")
</code></pre>
<p>根据使用脚本的用户的不同,您可能希望为extProc不存在的情况添加一些处理,但是当复制粘贴到Python控制台时,上面的代码确实会运行,如果按正确的顺序使用,则不会引发任何异常。我认为您的问题在于调用此代码的方式,因为您肯定不会将其复制到控制台。你知道吗</p>
<p>你可以尝试我所说的“Java方式”,然后编写一个类。这不是什么Pythonic,但它在代码周围创建了一个名称空间,并允许进行如下简单的条件检查:</p>
<pre><code>class Handler(object):
def __init__(self):
self.extProc = None
def do(self, command):
if command == '/starttest1':
extProc = sp.Popen(['python','haha.py'])
elif command == '/stoptest1':
if extProc is not None:
sp.Popen.terminate(extProc)
ectProc = None
print("haha.py has been closed")
else:
handle_no_extProc()
</code></pre>
<p>不过,不要在productive代码中使用这种方法(实际上,永远不要只使用<code>__init__</code>以外的方法编写类),但这是一种确保条件不是问题所在的方法。每次输入新命令时是否启动脚本?在这种情况下,没有办法保留参考资料。您应该考虑使用<code>input</code>函数来获取新命令并保留引用。据我所知,唯一的其他方法是处理低级别操作系统调用,但这可能不是您想要的。你知道吗</p>