如何在Windows 10系统下向Python启动的.exe进程发送Ctrl+C事件?
如何在Windows 10系统下向Python启动的.exe进程发送Ctrl+C事件?
首先得指出你现有代码里的核心问题:你用了subprocess.run(),这是个阻塞式调用——它会一直等到外部exe完全结束后,才会执行后面的time.sleep(10)和发送信号的代码,这显然和你想“运行10秒后再发终止信号”的需求完全相反。
另外,subprocess.send_signal(signal.SIGINT)这种写法也不对,你需要针对具体的进程对象发送信号,而不是直接调用模块方法。在Windows系统下,模拟Ctrl+C要用到专门的CTRL_C_EVENT信号,而不是Linux下的SIGINT(虽然Python做了部分兼容,但直接用更Windows原生的信号更可靠)。
下面是修改后的可行方案,我会一步步解释:
修正后的代码
import subprocess import time import signal # 路径和参数保持不变 exe_path = r"C:\Users\chris\Downloads\redpitayatest\rpsa_client.exe" arguments = [ "-s", "-h", "169.254.219.196", "-p", "8900", "-f", "csv", "-d", r"C:\Users\chris\Downloads\redpitayatest\test", "-m", "volt" ] # 用Popen启动进程(非阻塞,程序会继续往下执行) process = subprocess.Popen( [exe_path] + arguments, cwd=r"C:\Users\chris\Downloads\redpitayatest", # 尽量不要用shell=True,除非你的exe必须依赖shell环境启动 # shell=True, capture_output=True, text=True ) print("定时器启动,等待10秒...") time.sleep(10) print("发送Ctrl+C信号给进程...") # 在Windows下发送模拟Ctrl+C的信号 try: process.send_signal(signal.CTRL_C_EVENT) # 等待进程正常结束,确保它完成数据转换和保存 stdout, stderr = process.communicate() print("进程正常结束,输出内容:") print(stdout) if stderr: print("错误输出:") print(stderr) except Exception as e: print(f"发送信号时出错:{e}") # 万不得已才强制杀死进程 process.kill()
关键修改点说明
- 改用
subprocess.Popen():这是启动外部进程的非阻塞方式,启动后Python代码会继续执行后续的sleep和信号发送逻辑,完美匹配你的定时需求。 - 发送
CTRL_C_EVENT信号:在Windows系统中,这个信号专门用来模拟控制台的Ctrl+C操作,能触发目标exe的优雅终止流程(也就是你手动操作时的“停止流、转换数据、保存、关闭”步骤)。 - 用
communicate()等待进程结束:代替直接kill,确保进程有足够时间完成数据处理,避免出现“无数据保存”的问题。 - 移除不必要的
shell=True:除非你的exe必须通过系统shell启动(比如依赖环境变量或批处理脚本),否则尽量不要用,它会增加额外的进程层,可能导致信号发送失效。
备选方案(如果上述方法失效)
如果因为某些原因(比如目标exe不是控制台进程),CTRL_C_EVENT无法生效,可以尝试用Windows的API模拟键盘输入,但这种方法需要确保目标进程的窗口处于前台,可靠性稍差:
import win32api import win32con # 先找到进程的窗口句柄(需要额外的win32gui模块) # 这里假设你已经拿到了窗口句柄hwnd win32api.SetForegroundWindow(hwnd) win32api.keybd_event(win32con.VK_CONTROL, 0, 0, 0) win32api.keybd_event(ord('C'), 0, 0, 0) # 释放按键 win32api.keybd_event(ord('C'), 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_CONTROL, 0, win32con.KEYEVENTF_KEYUP, 0)
不过这种方法需要安装pywin32库(pip install pywin32),且需要处理窗口查找的逻辑,优先级低于第一种方案。
备注:内容来源于stack exchange,提问作者ChrisD91
相关产品推荐
相关产品推荐

