subprocess.Popen不接收SIGINT / SIGKILL

时间:2014-12-10 18:08:22

标签: python subprocess wait sigint

从Python脚本我想在新线程中打开vlc并允许用户干净地关闭它(仍然来自这个脚本)。似乎send_signal()指令实际上并没有关闭vlc,我做错了什么?

import subprocess
import signal

s = subprocess.Popen("vlc", shell=True)
raw_input("Press Enter to stop vlc...")
s.send_signal(signal.SIGINT)
print "waiting for vlc to exit..."
s.wait()
编辑:我替换了vlc用于测试/说明目的,但我真正的需要是结束由ffmpeg记录的流,这通常是在监听SIGINT,因为这是退出的标准信号(它说"按ctrl- c停止编码")。

3 个答案:

答案 0 :(得分:1)

SIGINT通常保留用于Ctrl-C中断。在GUI应用程序中可能会忽略它。发送到正常终止应用程序的正确信号是SIGTERM,或SIGKILL突然终止它。

但是使用子进程模块,您可以(应该)直接调用子进程对象的方法terminatekill

答案 1 :(得分:0)

vlc可能忽略了信号。尝试发送SIGTERMSIGKILL

有关Unix终止信号的更多详细信息,请参阅this link(假设您在Unix / Linux下运行。)请参阅可以阻止和/或忽略哪些信号的说明。

答案 2 :(得分:0)

好的,我终于用

来缩短外壳
s = subprocess.Popen(["vlc"])  

现在发送SIGINT / SIGKILL实际上会关闭进程。我没有解释为什么使用shell的第一个选项不起作用。