Python subprocess.Popen中的Shell脚本不会终止子进程

时间:2018-02-27 10:52:04

标签: python python-2.7 tkinter popen

我遇到了中断subprocess.Popen的问题。这是设置:

我有一个Tkinter gui,它使用Popen运行另一个python脚本。这个内部脚本(我们称之为running script)正在运行一个shell shell脚本,它使用Popen执行一段C ++代码,因此层次结构看起来像这样:

GUI
\running_script
 \shell-script
  \c++

running_script的工作方式是,如果收到中断,它会将SIGINT发送给shell-script。如果我用shell_script单独使用我的C ++代码运行running_script并执行CRTL + C,一切都像魅力一样。但是,如果我使用GUI运行running_script作为Popen,SIGINT被发送到running_script正确接收它并将中断信号发送到shell-script,而不是终止内部进程(作为c ++代码),shell-script终止自身,C ++进程继续运行,因为它在后台运行,但事实并非如此。当我执行ps -xaf时,树看起来像这样:

GUI
\running_script
 \shell-script <defunct>
c++

所以重申一下,当我在没有GUI的情况下运行它时,它就像一个魅力,但是使用GUI,它的行为如上所述。我也试过发送shell-command一个SIGTERM而不是SIGINT,结果是一样的。

1 个答案:

答案 0 :(得分:0)

您可以在shell脚本中捕获SIGINT并使其将SIGINT发送到c ++程序,例如:

#!/bin/bash
./cpp_program &
procpid=$!
function killit() {
    kill -SIGINT $procpid
}
trap killit SIGINT
......