我有一个测试工具(用 Python 编写)需要通过发送 ^C
来关闭被测程序(用 C 编写)。在 Unix 上,
proc.send_signal(signal.SIGINT)
工作完美。在 Windows 上,这会引发错误(“不支持信号 2”或类似的错误)。我在 Windows 上使用 Python 2.7,所以我觉得我应该可以这样做
proc.send_signal(signal.CTRL_C_EVENT)
但这根本没有做任何事情。我需要做什么?这是创建子流程的代码:
# Windows needs an extra argument passed to subprocess.Popen,
# but the constant isn't defined on Unix.
try: kwargs['creationflags'] = subprocess.CREATE_NEW_PROCESS_GROUP
except AttributeError: pass
proc = subprocess.Popen(argv,
stdin=open(os.path.devnull, "r"),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
**kwargs)
原文由 zwol 发布,翻译遵循 CC BY-SA 4.0 许可协议
有一个解决方案是使用包装器(如 Vinay 提供的链接中所述),该包装器使用 Windows 启动 命令在新的控制台窗口中启动。
包装器代码:
捕捉CTRL-C的程序代码:
启动包装器,例如:
您需要添加一些 IPC 代码,以允许您控制触发 os.kill(signal.CTRL_C_EVENT, 0) 命令的包装器。我在我的应用程序中为此目的使用了套接字。
解释:
预知
send_signal(CTRL_C_EVENT)
不起作用,因为CTRL_C_EVENT
仅适用于os.kill
。 [REF1]os.kill(CTRL_C_EVENT)
发送信号到当前cmd窗口中运行的所有进程 [REF2]Popen(..., creationflags=CREATE_NEW_PROCESS_GROUP)
不起作用,因为CTRL_C_EVENT
被进程组忽略。 [REF2] 这是 python 文档 [REF3] 中的错误实施方案
有用的帖子是:
我不得不删除链接前面的 http,因为我是新用户,不允许发布两个以上的链接。
更新:基于 IPC 的 CTRL-C 包装器
在这里你可以找到一个自写的 python 模块,它提供了一个 CTRL-C 包装,包括一个基于套接字的 IPC。语法与 subprocess 模块非常相似。
用法:
代码