Python3.4 - 如何获取以Popen启动的程序的PID? (OS -Raspbian Jessie)

时间:2016-11-15 19:16:09

标签: python python-3.x process popen kill

Python 3.4

操作系统 - Raspbian Jessie Raspberry Pi 3上运行

注意:该计划" gnutv "没有停止命令。它只有一个计时器选项来停止录制。

我的问题: 我仍然是编程和Python(自我/ YouTube /书籍教学)的新手。我正在编写一个程序来检查系统是否有警报。当出现警报时,它会触发程序" gnutv"开始将视频录制到文件中。这很容易。我可以启动程序,并使用

录制视频
Popen(["gnutv", "-out", "file", str(Videofile), str(Channel)])

程序会在录制视频时继续监听闹钟输入,以便知道何时停止录制。但是当警报不再存在时,我无法停止录制。我试图使用kill(),terminate()和其他没有成功(所有返回的错误表明我不知道如何使用这些更复杂的命令)。 HOWEVER ,我 CAN 通过切换到终端并使用

查找PID来终止进程
pidof 'gnutv'

然后用

杀死它
kill PID#

那么如何从终端返回的PID值,这样我就可以将kill命令发送到终端(再次使用Popen)? 即 - Popen(['kill', 'PID#'])

1 个答案:

答案 0 :(得分:2)

您无需自行运行kill程序,只需在.kill()对象上调用.terminate()Popen即可。

import subprocess
proc = subprocess.Popen(['gnutv', '-out', 'file', str(Videofile), str(Channel)])
# Some time later...

# This is equivalent to running "kill <pid>"
proc.terminate()

# This is equivalent to running "kill -9 <pid>"
proc.kill()

如果你真的需要pid(提示:你没有),你也可以从对象中获取它,它存储在pid属性中。

print('Spawned gnutv (pid={})'.format(proc.pid))

你真的应该运行kill程序,因为该程序首先只是kill()函数的包装器。只需直接调用函数,或通过subprocess提供的包装器。