Python Popen()启动两个进程而不是一个进程

Python Popen()启动两个进程而不是一个进程,python,subprocess,raspberry-pi,Python,Subprocess,Raspberry Pi,我正在使用raspberry pi进行一个项目,希望检测pi上的按钮按下以启动程序(挤压),然后当再次按下按钮时,使用启动程序时捕获的PID杀死程序。我认为python子流程模块是一个很好的选择,但是,我有一个无法解决的问题 守则: proc=subprocess.Popen(['squeezelite','-o','sysdefault:CARD=ALSA','-n','test','-m', '01:00:00:00:00:03','-z']) 似乎启动了两个过程: 2886 pts/0

我正在使用raspberry pi进行一个项目,希望检测pi上的按钮按下以启动程序(挤压),然后当再次按下按钮时,使用启动程序时捕获的PID杀死程序。我认为python子流程模块是一个很好的选择,但是,我有一个无法解决的问题

守则:

proc=subprocess.Popen(['squeezelite','-o','sysdefault:CARD=ALSA','-n','test','-m', '01:00:00:00:00:03','-z'])
似乎启动了两个过程:

2886 pts/0   Z+    0:00 [squeezelite] defunct

2887 ?       SLsl  0:00 squeezelite -o sysdefault:CARD=ALSA -n test -m 01 00 00 00 00 03 -z
并且proc.pid返回第一个的pid

如果我调用proc.communicate(),那么第一个进程将被清理,只剩下第二个进程,顺便说一下,这就是我想要的。但是,我不知道第二个进程的PID(因为proc.PID给我的第一个进程现在已经不存在了)。所以我不能在kill命令中使用PID

我尝试了subprocess.Popen的各种组合,并使用了不同的选项(例如字符串参数、参数参数、shell=True、shell=False),每个组合都给出了类似的结果

有人能帮我把这件事做好吗?或者是启动一个程序并在以后某个时候终止它的更好方式

谢谢
aussieW

您使用的是squeezelite的
-z
选项,该选项可以对流程进行后台监控。这就解释了为什么要创建一个额外的进程。我认为最好的解决方案是使用OS Daemoning工具(例如启动-停止守护进程),简化Python的调用。有一种方法可以帮助你开始


您需要启动该进程并将其PID保存在文件中,以便以后可以停止它。一种方法可能是使用包含两个参数的守护程序脚本:开始/停止和按钮的标识符。

它被称为僵尸进程:我不确定是否应该删除它。您使用的是什么分发版?您可以使用它的Daemoning工具来简化python的工作。例如,。我知道第一个进程变成了一个僵尸进程,并被调用的proc.communicate()清除。我的问题是,为什么要创建两个进程,而我只想要一个,而我想要的是第二个而不是第一个。我不知道squeezelite,但你用
daemonize
开关调用它,保罗·阿尔梅达——我使用的发行版是拉斯皮菲,我很确定它是基于喘息。我想做的是使用三个单独的按钮启动并杀死最多三个单独的挤压器实例。您认为Daemoning工具适用于该任务吗?谢谢您的帮助,但我最终通过从我在Popen调用中传递的参数中删除-z开关使其正常工作。