当我在前面的if语句中打开子流程时,有没有关闭它的方法

2024-10-08 18:30:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python脚本,当给定/starttest1命令时,它会打开另一个python脚本,当命令为/stoptest1时,我想关闭它

我试过用终止Popen.terminate()但它给了我一个错误

if command == '/starttest1':
        extProc = sp.Popen(['python','haha.py'])
    elif command == '/stoptest1':
        sp.Popen.terminate(extProc)
        print("haha.py has been closed")

我遇到的错误: UnboundLocalError:赋值前引用了局部变量“extProc”

我想要的结果是哈哈正在关闭并打印“哈哈“已关闭”


Tags: py命令脚本if错误spcommandprint
2条回答

tl,dr:条件块并不重要。它们没有自己的名称空间,因此该异常还有其他原因

Python的条件块没有单独的名称空间。您可以访问条件块中定义的任何变量,就像它们是在常规程序流中定义的一样。如果条件没有命中,并且您试图访问一个变量,那么解释器将引发NameError。所以你可以这么做:

if command == '/starttest1':
    extProc = sp.Popen(['python','haha.py'])
elif command == '/stoptest1':
    sp.Popen.terminate(extProc)
    print("haha.py has been closed")

根据使用脚本的用户的不同,您可能希望为extProc不存在的情况添加一些处理,但是当复制粘贴到Python控制台时,上面的代码确实会运行,如果按正确的顺序使用,则不会引发任何异常。我认为您的问题在于调用此代码的方式,因为您肯定不会将其复制到控制台。你知道吗

你可以尝试我所说的“Java方式”,然后编写一个类。这不是什么Pythonic,但它在代码周围创建了一个名称空间,并允许进行如下简单的条件检查:

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()

不过,不要在productive代码中使用这种方法(实际上,永远不要只使用__init__以外的方法编写类),但这是一种确保条件不是问题所在的方法。每次输入新命令时是否启动脚本?在这种情况下,没有办法保留参考资料。您应该考虑使用input函数来获取新命令并保留引用。据我所知,唯一的其他方法是处理低级别操作系统调用,但这可能不是您想要的。你知道吗

您应该为控制进程创建新线程,例如:

import subprocess as sp

process = None

def handler():
    global process
    if command == '/start'
        process = sp.Popen(['python','haha.py'])
    elif command == '/stop':
        if process is not None:
            sp.Popen.terminate(process) # terminate
        # e.g. else send error message "Process is not running"

这不是最好的例子,但至少要注意其中的含义。你知道吗

相关问题 更多 >

    热门问题