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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:36