【问题标题】:How to kill a subprocess in python如何在python中杀死一个子进程
【发布时间】:2020-02-20 11:49:19
【问题描述】:

我的代码使用gst-launchcommand 在 linux 电脑上运行网络摄像头。

当我终止进程时,网络摄像头窗口没有关闭,但程序停止运行。我希望网络摄像头窗口也关闭。 你能帮我解决这个问题吗?

import subprocess
import time
import os
import signal

cmd = "gst-launch-1.0 -v v4l2src ! video/x-raw,format=YUY2 ! videoconvert ! autovideosink"
process = subprocess.Popen(cmd, shell = True)
time.sleep(5)
#print(subprocess.Popen.pid)
#process.terminate()
os.kill(process.pid, signal.SIGKILL)
#process.kill()

【问题讨论】:

  • 您的代码中基本上已经将答案注释掉了。

标签: python python-3.x subprocess os.system gst-launch


【解决方案1】:

希望对你有所帮助。

import os
import signal
import subprocess

process = subprocess.Popen(cmd, shell = True)
os.killpg(os.getpgid(process.pid), signal.SIGTERM)

【讨论】:

  • 谢谢它的工作,os.kill() 和 os.killpg() 有什么区别?
  • @MahimaK 实际上在 os.killpg() 中的所有 pg(进程组)都将被杀死。为此,您应该将会话 ID 附加到衍生/子进程的父进程,在您的情况下它是 shell。这将使其成为流程的组长。所以现在,我们向进程的父进程发出一个信号,父进程会将它传递给所有子进程。
  • 哦,好的,我正在编写一个包含子进程的烧瓶应用程序,但是 os.killpg 命令退出程序,我希望程序在执行后也能运行。你怎么能做到这一点?
【解决方案2】:

对我来说,当前接受的答案也将终止主程序。如果您遇到同样的问题并希望它继续,您还必须将参数 preexec_fn=os.setsid 添加到 popen。所以总的来说:

import os
import signal
import subprocess

process = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)
os.killpg(os.getpgid(process.pid), signal.SIGTERM)

我从这里得到这个:https://stackoverflow.com/a/4791612/11642492

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 2010-12-08
    • 2018-06-09
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多