Python 在 Windows 上发送 SIGINT 信号子进程

Posted

技术标签:

【中文标题】Python 在 Windows 上发送 SIGINT 信号子进程【英文标题】:Python Send SIGINT Signal Subprocess On Windows 【发布时间】:2018-11-25 10:26:26 【问题描述】:

我已经阅读了很多关于 *** 的问题,但它们太旧了,对我没有帮助。 我有一个子进程并想发送 CTRL_C_EVENT 信号来停止它。我不想直接杀死它。 这是我的代码:

import subprocess
import os
import signal

CREATE_NO_WINDOW = 0x08000000
'''
I tried these too but i failed.
creationflags=CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008
'''

cmd = 'my cmd arguments'
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True,shell=True,creationflags=CREATE_NO_WINDOW)
test = 0
for line in process.stdout:
    test += 1
    if (test > 60):
        os.kill(process.pid, signal.CTRL_C_EVENT)
        #This fails too
        #process.send_signal(signal.CTRL_C_EVENT)
    else:
        print(line)

这里例外:

OSError: [WinError 6] The handler is invalid

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\xxxxxxx\Desktop\xxxxx\test subprocess.py", line 16, in <module>
    os.kill(process.pid, signal.CTRL_C_EVENT)
SystemError: <built-in function kill> returned a result with an error set

【问题讨论】:

【参考方案1】:

我希望这是因为您的进程仍在使用中,因为 for line in process.stdout:

您可能必须先退出 for 循环然后发送 CTRL_C_EVENT 信号来停止它

试试这样的:

import subprocess
import os
import signal

CREATE_NO_WINDOW = 0x08000000
'''
I tried these too but i failed.
creationflags=CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008
'''

cmd = 'my cmd arguments'
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True,shell=True,creationflags=CREATE_NO_WINDOW)
test = 0

CTRL_C_EVENT_is_required=False

for line in process.stdout:
    test += 1
    if (test > 60):
        CTRL_C_EVENT_is_required=True
        break
    else:
        print(line)

if CTRL_C_EVENT_is_required==True:
    os.kill(process.pid, signal.CTRL_C_EVENT)

【讨论】:

我仍然遇到同样的错误。我也尝试了 time.sleep(20) 并发送 os.kill ctrl_cl_event 信号,但结果相同。

以上是关于Python 在 Windows 上发送 SIGINT 信号子进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将打印作业发送到打印机

项目中遇到的进程间通信方式

Linux信号及工作原理

Nodejs:将 Ctrl+C 发送到 Windows 上的子进程

Python邮件发送脚本(Linux,Windows)通用

套接字阻止在 Java 服务器和 Python 客户端之间发送消息