使用Python启动和停止子流程

使用Python启动和停止子流程,python,Python,我试图通过MQTT命令启动和停止设备上的程序,但它并没有按照我所希望的方式工作 要开始此过程,我将使用: p = subprocess.Popen(["sh", "process.sh"]) 这很好,它启动了程序 在代码的下一行,我试图用p.kill或p.terminate终止/终止程序,但它返回代码: p.terminate() UnboundLocalError: local variable 'p' referenced before assignment 我使用的代码是我自己的,如下

我试图通过
MQTT
命令启动和停止设备上的程序,但它并没有按照我所希望的方式工作

要开始此过程,我将使用:

p = subprocess.Popen(["sh", "process.sh"])
这很好,它启动了程序

在代码的下一行,我试图用
p.kill
p.terminate
终止/终止程序,但它返回代码:

p.terminate()
UnboundLocalError: local variable 'p' referenced before assignment
我使用的代码是我自己的,如下所示:

def on_message(client, userdata, msg):
        if msg.payload == "start":
                p = subprocess.Popen(["sh", "stream.sh"])
        if msg.payload == "stop":
                p.terminate()

你必须把p定义为全局的

def on_message(...):
    global p

如果消息上的
是回调函数,则它不记得以前的调用。您需要将对
p
的引用存储在某个地方,并在随后的函数调用中检索它。如果您想进一步了解发生此问题的原因,请仔细阅读。
p = None

def on_message(client, userdata, msg):
    global p
    if msg.payload == "start":
            p = subprocess.Popen(["sh", "stream.sh"])
    if msg.payload == "stop" and p:
            p.terminate()