【问题标题】:Reading stdout from subprocess from the main process using PIPE causing the death of the subprocess使用 PIPE 从主进程读取子进程的标准输出导致子进程死亡
【发布时间】:2020-08-07 15:16:19
【问题描述】:

我有一个简单的代码:

proc = subprocess.Popen(["/home/root/cc6ul/./IQ-sampler", str(self.num_files), str(self.n), self.results_directory, self.device_id, self.rid, self.cc6ul_state_filepath], stdout=subprocess.PIPE)

while proc.poll() is None:
    line = proc.stdout.readline()
    self.log.info("line:{}".format(line))

这导致我的 IQ-sampler 进程提前终止。但是如果我直接从终端运行它就没有问题。我尝试对此进行调试,但我不明白根本原因。 是导致问题的通信管道吗?因为这是我能看到的两个进程之间的唯一联系。

【问题讨论】:

  • IQ-sampler 是做什么的?
  • IQ-sampler 是 C 代码可执行文件,它不接收文件,每个文件没有样本,并通过定时器回调从连接到雷达传感器的 ADC 收集 I&Q 通道数据。然后在成功收集每个文件后将保存文件的路径标准输出到主进程。

标签: python subprocess pipe stdout popen


【解决方案1】:

经过大量调试后,问题似乎出在使用 SIGEV_THREAD 线程通知的 IQ-sampler linux C 计时器回调中。在使用锁的关键部分中包含计时器回调似乎已经解决了这个问题。

有趣的是,只有当其他进程(这里是主要的 python 进程)运行时,IQ-sampler 才会死机,这让我相信 CPU 上的负载可能会加剧并发问题。

【讨论】:

    【解决方案2】:

    如果命令在终端上有效,那么您可以简单地将shell=True 和实际命令传递给 Popen 函数。这应该与在 shell 上执行命令具有完全相同的输出。

    【讨论】:

    • 我看不出这将如何帮助解决 OP 描述的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 2016-11-17
    • 2016-03-26
    • 1970-01-01
    • 2011-02-17
    • 2015-01-20
    相关资源
    最近更新 更多