You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键修改点说明

  1. 改用subprocess.Popen():这是启动外部进程的非阻塞方式,启动后Python代码会继续执行后续的sleep和信号发送逻辑,完美匹配你的定时需求。
  2. 发送CTRL_C_EVENT信号:在Windows系统中,这个信号专门用来模拟控制台的Ctrl+C操作,能触发目标exe的优雅终止流程(也就是你手动操作时的“停止流、转换数据、保存、关闭”步骤)。
  3. 用communicate()等待进程结束:代替直接kill,确保进程有足够时间完成数据处理,避免出现“无数据保存”的问题。
  4. 移除不必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:59:36