【问题标题】:Delegate signal handling to a child process in python将信号处理委托给python中的子进程
【发布时间】:2014-07-24 14:12:27
【问题描述】:

如何从 python 脚本运行命令并将信号委托给它,例如Ctrl+C

我的意思是当我运行时,例如:

from subprocess import call
call(["child_proc"])

我想让child_proc 处理Ctrl+C

【问题讨论】:

  • 你能更清楚你想要完成什么吗?你想让子进程做什么?
  • 查看我更新的问题
  • @remdezx 您希望将发送到父进程的信号转发给子进程,还是只想从父进程向子进程发送信号?
  • 我希望将发送给父母的信号转发给孩子。

标签: python signals subprocess control-c


【解决方案1】:

我猜您的问题是您希望子进程接收 Ctrl-C 并且不让父 Python 进程终止?如果您的子进程为 Ctrl-C (SIGINT) 初始化了自己的信号处理程序,那么这可能会奏效:

import signal, subprocess

old_action = signal.signal(signal.SIGINT, signal.SIG_IGN)
subprocess.call(['less', '/etc/passwd'])
signal.signal(signal.SIGINT, old_action)         # restore original signal handler

现在您可以按 Ctrl-C(生成 SIGINT),Python 会忽略它,但 less 仍会看到它。

但是这只有在子级正确设置其信号处理程序时才有效(否则这些是从父级继承的)。

【讨论】:

  • 您可能应该设置:preexec_fn=restore_signal,其中 restore_signal 将 SIGINT 恢复为 SIG_DFL。 preexec_fn 在子进程中运行(在 fork() 之后,exec*() 之前)。
  • “否则这些 [信号处理程序] 是从父级继承的”——这是 python 的东西还是 unix 的东西?另外,有没有关于进程信号和继承的进一步阅读链接?
  • @bennlich:信号处置的继承当然是 Unix 的事情——我不确定它在 Windows 上的实现。使用 Linux 手册页 man 7 signal 作为参考,如果需要,请搜索以获取其他资源。
猜你喜欢
  • 2015-12-05
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2014-12-09
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多