我有一个简单的代码。
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 -采样器进程在时间之前死亡。但如果我直接从终端运行它,它就没有问题。我试着调试了一下,但我不明白根本原因。是通信PIPE的问题吗?因为这是我能看到的2个进程之间的唯一连接。
经过大量的调试,问题似乎出在IQ-sampler linux C语言的定时器回调上,它使用的是SIGEV_THREAD线程通知。将定时器回调加入到关键部分使用锁,似乎解决了这个问题。
有趣的是,只有当其他进程(这里是主python进程)运行时,IQ-sampler才会死亡,这让我认为CPU的负载可能加剧了并发问题。
如果这个命令在终端上可以工作,那么你可以简单地通过输入 shell=True
和实际的命令到Popen函数中。这样做的结果应该和在shell上执行命令的结果完全一样。