如何将程序及USB设备管理二进制程序的输出重定向至Python脚本?
如何将外部程序的输出直接重定向到Python脚本
当然可以直接把程序的输出导入你的Python脚本,完全不用先写到文件再读取——你之前用subprocess没成功,大概率是没用到正确的参数配置。我来一步步给你解决这个问题:
核心思路:用subprocess捕获程序输出
os.system的局限性在于它只执行命令,不会捕获程序的输出流。而subprocess模块专门设计了处理外部进程输入输出的能力,通过stdout=subprocess.PIPE参数,就能直接把外部程序的输出接到Python脚本里。
场景1:一次性获取完整二进制输出
你的capture.exe输出的是二进制文件(.bin),所以我们直接捕获字节流即可,不用转成文本。改写你的函数如下:
import subprocess def rn_to_script(comport=3, amount=128): try: # 将命令拆分为参数列表(比字符串拼接更安全,避免shell注入风险) result = subprocess.run( ['capture.exe', str(comport), str(amount)], stdout=subprocess.PIPE, # 捕获标准输出到管道 stderr=subprocess.PIPE, # 可选:同时捕获错误输出 check=True # 如果程序执行失败(返回码非0),直接抛出异常 ) # result.stdout就是capture.exe输出的二进制数据 output_data = result.stdout # 在这里直接处理output_data,比如解析、保存到内存、或者写入其他地方 # 示例:如果要保存到文件,也可以直接写,不用先让capture.exe输出到文件 # with open('test.bin', 'wb') as f: # f.write(output_data) return output_data except subprocess.CalledProcessError as e: # 处理程序执行失败的情况,比如打印错误信息 print(f"capture.exe执行出错: {e.stderr.decode('utf-8')}") raise
场景2:实时处理输出(如果程序持续输出数据)
如果capture.exe是持续输出数据的(比如实时读取USB设备),可以用subprocess.Popen来实时读取输出流,而不是等程序结束再获取全部内容:
import subprocess def rn_stream(comport=3, amount=128): # 启动进程并保持管道打开 process = subprocess.Popen( ['capture.exe', str(comport), str(amount)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0 # 关闭缓冲,实现实时读取 ) # 循环读取输出直到进程结束 while True: # 每次读取1024字节(可以根据你的需求调整) chunk = process.stdout.read(1024) if not chunk: # 没有更多数据,退出循环 break # 在这里处理每个数据块,比如解析USB数据、实时打印等 print(f"收到{len(chunk)}字节数据") # 你的自定义处理逻辑写在这里 # 等待进程结束并检查返回码 return_code = process.wait() if return_code != 0: error_msg = process.stderr.read().decode('utf-8') print(f"程序执行失败,错误信息: {error_msg}")
关键注意事项
- 参数列表 vs 字符串:尽量用参数列表(
['capture.exe', '3', '128'])而不是拼接字符串,这样可以避免shell注入风险,同时在Windows和Linux下都更兼容。 - 二进制 vs 文本:因为你的输出是
.bin二进制文件,所以直接用result.stdout(字节类型);如果是文本输出,可以添加encoding='utf-8'参数,把输出转成字符串。 - 错误处理:用
check=True或者手动检查返回码,能及时发现capture.exe执行失败的情况,方便调试。
内容的提问来源于stack exchange,提问作者MetaStack
相关产品推荐
相关产品推荐

