Python中subprocess多命令数据传递异常:rtl_fm输出无法传给multimon-ng
问题分析与修复
你的代码无法实现管道输出传递的核心问题是启动rtl_fm进程时未将其标准输出导向管道,导致multimon-ng无法读取到它的输出。另外多余的time.sleep调用也可能引入不必要的延迟或异常。
具体修复点
- 启动
rtl_fm时必须指定stdout=subprocess.PIPE,让它的输出被管道捕获,供后续进程读取 - 移除不必要的
time.sleep,进程间管道通信无需手动等待 - 关闭
rtl_fm的stdout句柄,避免资源泄漏,让multimon-ng负责处理管道输入
修正后的代码片段
elif args.source == 'rtl': sys.stdout.write('RTL\n') sys.stdout.write(f"rtl_fm -f {str(args.frequency[0])}M -M fm -s 22050 -E dc -p {str(args.ppm[0])} - | multimon-ng -t raw -a EAS\n") try: # 替换硬编码的频率和ppm,使用传入的参数 rtl_fm_cmd = ['rtl_fm', '-f', str(args.frequency[0]) + 'M', '-M', 'fm', '-s', '22050', '-E', 'dc', '-p', str(args.ppm[0]), '-'] multimon_ng_cmd = ['multimon-ng', '-t', 'raw', '-a', 'EAS'] # 启动rtl_fm,将输出导向管道 rtl_fm_process = subprocess.Popen(rtl_fm_cmd, stdout=subprocess.PIPE) # 启动multimon-ng,从rtl_fm的管道读取输入 multimon_ng_process = subprocess.Popen(multimon_ng_cmd, stdin=rtl_fm_process.stdout, stdout=subprocess.PIPE) # 关闭rtl_fm的stdout句柄,让multimon-ng接管管道 rtl_fm_process.stdout.close() source_process = multimon_ng_process except Exception as detail: logging.error(detail) return
备选方案(直接复用Shell管道)
如果上述方式仍有问题,可以直接使用shell=True让系统Shell处理管道逻辑,和你在CMD中执行的方式完全一致:
source_process = subprocess.Popen( f"rtl_fm -f {str(args.frequency[0])}M -M fm -s 22050 -E dc -p {str(args.ppm[0])} - | multimon-ng -t raw -a EAS", stdout=subprocess.PIPE, shell=True # 若需要单独弹出控制台窗口,可添加 creationflags=subprocess.CREATE_NEW_CONSOLE )
内容的提问来源于stack exchange,提问作者Jamieden
相关产品推荐
相关产品推荐

