如何通过Python判断C++控制台程序何时等待输入并自动传入输入?
用Python给Windows控制台C++程序自动传入输入(适配不可预知的输入时机)
在Windows系统下,你可以借助pywin32库调用WinAPI实现需求,核心思路是通过匿名管道重定向C++程序的标准输入,随时向管道写入数据,无论程序何时等待输入都能接收。
步骤1:安装依赖
首先安装pywin32库:
pip install pywin32
步骤2:实现代码
以下是完整示例代码,替换你的C++程序路径即可直接使用:
import win32process import win32api import win32con import win32file import win32pipe import time def send_input(h_write, input_text): # Windows控制台默认GBK编码,需匹配C++程序的输入编码 encoded_data = input_text.encode("gbk") + b"\r\n" # 追加回车符模拟用户输入回车 win32file.WriteFile(h_write, encoded_data) if __name__ == "__main__": # 配置进程启动信息,重定向标准输入 startup_info = win32process.STARTUPINFO() startup_info.dwFlags = win32con.STARTF_USESTDHANDLES # 创建匿名管道,用于向C++程序传递输入 h_read, h_write = win32pipe.CreatePipe(None, 0) startup_info.hStdInput = h_read startup_info.hStdOutput = win32file.GetStdHandle(win32file.STD_OUTPUT_HANDLE) startup_info.hStdError = win32file.GetStdHandle(win32file.STD_ERROR_HANDLE) # 启动目标C++控制台程序,替换为你的程序路径 cpp_program_path = r"C:\your\cpp\program\path.exe" process_info = win32process.CreateProcess( None, cpp_program_path, None, None, True, # 允许子进程继承管道句柄 0, None, None, startup_info ) h_process, h_thread = process_info # 模拟在不同时机发送输入(根据实际需求调整) time.sleep(3) # 等待3秒后发送第一个输入 send_input(h_write, "Hello from Python") time.sleep(8) # 再过8秒发送第二个输入 send_input(h_write, "中文测试") # 等待C++程序执行完毕 win32process.WaitForSingleObject(h_process, win32con.INFINITE) # 关闭所有句柄释放资源 win32api.CloseHandle(h_read) win32api.CloseHandle(h_write) win32api.CloseHandle(h_process) win32api.CloseHandle(h_thread)
关键注意事项
- 编码匹配:Windows控制台默认使用GBK编码,若你的C++程序指定了UTF-8等其他编码,需修改
encode方法的参数。 - 管道继承:
CreateProcess的第五个参数必须设为True,确保子进程能继承管道句柄。 - 输入缓冲:若程序暂时未等待输入,写入管道的数据会被缓冲,等程序下次读取输入时自动获取,无需担心时机问题。
- 资源释放:程序结束后务必关闭所有创建的句柄,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Jugert Mucoimaj
相关产品推荐
相关产品推荐

