Windows下如何将Python循环生成的图片路径传给等待的子进程?
嘿,这个场景我太熟悉了——为了避免反复启动进程的开销,复用一个长期运行的子进程确实是最优解。结合你用的Windows系统和Python3.5.4,我给你一套可行的实现方案:
核心思路
你的目标检测程序是通过**标准输入(stdin)**等待图片路径的,那我们只需要在启动子进程时,把它的stdin和主进程的管道打通,之后每5帧就把RAM磁盘里的图片路径通过管道写给它就行。同时要注意处理子进程的输出缓冲区,避免因为输出堆积导致进程卡住。
具体代码实现
1. 启动并配置子进程
首先我们用subprocess.Popen启动检测程序,同时开启线程读取它的输出(防止缓冲区阻塞):
import subprocess import threading def read_subprocess_output(process, output_label): """读取子进程的输出,避免缓冲区满导致阻塞""" # 循环读取输出直到进程结束 for line in iter(process.stdout.readline, b''): print(f"[检测程序 {output_label}] {line.decode('utf-8').strip()}") for line in iter(process.stderr.readline, b''): print(f"[检测程序 {output_label} 错误] {line.decode('utf-8').strip()}") # 替换成你的目标检测程序路径 detect_program_path = r"C:\your\detect\program.exe" # 启动子进程,打通stdin/stdout/stderr管道 detect_process = subprocess.Popen( [detect_program_path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, # Windows下直接调用exe不需要shell=True text=False # Python3.5+支持,用字节流模式处理输入输出 ) # 启动线程读取子进程的输出,设为守护线程随主进程退出 stdout_thread = threading.Thread(target=read_subprocess_output, args=(detect_process, "输出")) stderr_thread = threading.Thread(target=read_subprocess_output, args=(detect_process, "错误")) stdout_thread.daemon = True stderr_thread.daemon = True stdout_thread.start() stderr_thread.start()
2. 每5帧发送图片路径
在你的模拟器循环里,每到第5帧就把RAM磁盘的图片路径写入子进程的stdin,记得加换行符并刷新缓冲区(否则数据会留在主进程缓冲区里,子进程收不到):
frame_counter = 0 # 你的自动驾驶模拟器主循环 while True: # --- 这里是你的模拟器逻辑:获取当前帧、保存到RAM磁盘 --- current_frame_path = r"D:\RAM_DISK\current_frame.jpg" # 替换成你的RAM磁盘路径 frame_counter += 1 if frame_counter % 5 == 0: # 把路径写给子进程,Windows下换行用\r\n path_to_send = f"{current_frame_path}\r\n" detect_process.stdin.write(path_to_send.encode('utf-8')) detect_process.stdin.flush() # 必须调用flush,确保数据立刻发送 print(f"已发送图片路径:{current_frame_path}") # 如果需要等待检测结果,可以在这里读取子进程的输出(根据你的程序返回格式调整) # 比如如果检测完成会输出"DETECT_DONE",可以在read_subprocess_output里处理或者在这里阻塞读取
关键注意事项
- 路径格式:Windows下路径用原始字符串
r""避免反斜杠转义问题,一定要用绝对路径,确保子进程能访问到RAM磁盘里的图片。 - 缓冲区刷新:必须调用
stdin.flush(),因为Python的输出缓冲区默认是行缓冲或全缓冲,不手动刷新的话数据不会立刻传递给子进程。 - 子进程异常处理:可以在循环里定期检查
detect_process.poll(),如果返回非None说明进程异常退出,需要重新启动它。 - 编码问题:Python3.5中用字节流模式(
text=False)时,要把字符串转成UTF-8字节再写入;如果用text=True,可以直接写字符串,但换行符还是要\r\n。
内容的提问来源于stack exchange,提问作者Martí Sánchez Juanola
相关产品推荐
相关产品推荐

