【问题标题】:Pausing Python subprocesses from keyboard input without killing the subprocess从键盘输入暂停 Python 子进程而不杀死子进程
【发布时间】:2013-11-11 00:05:44
【问题描述】:

我正在开发一个用 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 时起作用,没有其他任何效果(我想这就是子进程被杀死的原因)。

【问题讨论】:

  • “暂停”是什么意思。是否与SIGSTOP/SIGCONT 信号一样“暂停”(参见Jobs and sessions)?

标签: python signals subprocess keyboardinterrupt


【解决方案1】:

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

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

之后,send_signal() 函数可用于在您想暂停子进程时向子进程发送 SIGSTOP,并发送 SIGCONT 以恢复子进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多