从键盘输入暂停Python子进程而不会终止子进程

时间:2013-11-11 00:05:45

标签: python signals subprocess keyboardinterrupt

我正在开发一个用Python生成shell的项目,其中一个重要特性是能够暂停和后台运行的子进程。然而,我发现暂停子进程的唯一方法似乎立即将其删除,因此我以后无法恢复它。 我们小组尝试过除KeyboardInterrupt之外:

try:
    process = subprocess.Popen(processName)
    process.communicate()
except KeyboardInterrupt:
    print "control character pressed"

并使用信号:

def signal_handler(signal,frame):
    print 'control character pressed'

signal.signal(signal.SIGINT, signal_handler)
process.communicate()

另一个问题是这两个都只在按下Ctrl-C时有效,没有其他任何效果(我想这就是为什么子进程被杀死了)。

1 个答案:

答案 0 :(得分:1)

你让进程死亡的原因是因为你允许Ctrl + C到达子进程。如果您使用参数preexec_fn = os.setpgrp作为Popen调用的一部分,则子项将设置为与父项不同的进程组。

Ctrl + C将SIGINT发送到完整的进程组,但由于子进程位于不同的进程组,因此它不会收到SIGINT,因此不会死亡。

之后,send_signal()函数可用于在想要暂停时将SIGSTOP发送到子进程,并使用SIGCONT来恢复它。