Python 使用导致子进程死亡的管道从主进程读取子进程的标准输出

Python 使用导致子进程死亡的管道从主进程读取子进程的标准输出,python,subprocess,pipe,stdout,popen,Python,Subprocess,Pipe,Stdout,Popen,我有一个简单的代码: 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.s

我有一个简单的代码:

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采样器进程在时间之前死亡。但是如果我直接从终端运行它,它没有问题。我试着调试这个,但我不明白根本原因。
是通信管道导致了这些问题吗?因为这是我能看到的两个进程之间的唯一连接。

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

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


但有趣的是,只有当其他进程(主python进程正在运行)的时候,IQ采样器才会消亡,这让我相信CPU上的负载可能会加剧并发问题。

IQ采样器做什么?IQ采样器是不接受任何文件的C代码可执行文件,每个文件的采样数,并通过计时器回调从连接到雷达传感器的ADC收集I&Q通道数据。成功收集每个文件后,它会将保存的文件的路径标到主进程。我看不出这对解决OP描述的问题有什么帮助。