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

时间:2013-08-07 21:12:27

标签: python subprocess raspberry-pi

我正在使用raspberry-pi开发一个项目,并希望在pi上检测按钮以启动程序(squeezelite https://code.google.com/p/squeezelite/),然后再次按下按钮时使用程序启动时捕获的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

1 个答案:

答案 0 :(得分:1)

您正在使用squeezelite的-z选项,该选项会对进程进行守护。这解释了为什么要创建其他流程。我认为最好的解决方案是使用OS守护进程工具(例如,start-stop-daemon),简化你用Python做的调用。有一个guide about daemonizing squeezelite in Debian squeeze,可以帮助您入门。

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