【问题标题】:Python3.4 - How do I get the PID of a program that was started with Popen? (OS -Raspbian Jessie)Python3.4 - 如何获取使用 Popen 启动的程序的 PID? (操作系统-Raspbian Jessie)
【发布时间】:2016-11-15 19:16:09
【问题描述】:

Python 3.4

OS - Raspbian Jessie 在 Raspberry Pi 3

上运行

注意:程序“gnutv”没有停止命令。它只有一个计时器选项来停止录制。

我的问题: 我对编程和 Python 还是很陌生(自学/YouTube/教过的书)。我正在编写一个检查系统警报的程序。当出现警报时,它会触发程序“gnutv”开始将视频录制到文件中。那是容易的部分。我可以让程序启动,并使用录制视频

Popen(["gnutv", "-out", "file", str(Videofile), str(Channel)])

程序在视频录制期间继续监控警报输入,以便知道何时停止录制。但是当警报不再存在时,我无法让它停止录制。我尝试使用 kill()、terminate() 和其他方法都没有成功(所有返回的错误都表明我不知道如何使用这些更复杂的命令)。 但是,我可以通过切换到终端并使用查找 PID 来终止进程

pidof 'gnutv'

然后用

杀死它
kill PID#

那么我怎样才能返回我从终端获得的 PID 值 以便我可以将 kill 命令 发送到 终端(再次使用 Popen)? 即 - Popen(['kill', 'PID#'])

【问题讨论】:

  • 您可以尝试只运行killall gnutv(前提是您不介意杀死每个 GnuTV 实例),因此您不需要捕获终端输出。
  • 奇怪的是,我在退出 StackExchange 5 分钟后发现了这个解决方案……哈哈。感谢您的帮助:)

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


【解决方案1】:

您不需要运行kill 程序本身,您只需在Popen 对象上调用.kill() 或.terminate()。

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提供的包装器调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多