preexec_fn 参数来帮助我:
如果将 preexec_fn 设置为可调用对象,则将在执行子级之前在子进程中调用此对象。(仅Unix)
import subprocess
import signal
def preexec_function():
# Ignore the SIGINT signal by setting the handler to the standard
# signal handler SIG_IGN.
signal.signal(signal.SIGINT, signal.SIG_IGN)
my_process = subprocess.Popen(
["my_executable"],
preexec_fn = preexec_function
)
实际上并没有阻止信号到达子过程。相反,上面的 preexec_fn会 覆盖信号的默认处理程序,以便忽略该信号。因此,如果子 进程 再次覆盖 SIGINT 处理程序,则此解决方案 可能 不起作用。 __
该解决方案适用于各种子流程,即它也不限于使用Python编写的子流程。例如,我为其编写包装程序的专用服务器实际上是用Java编写的。