python子进程和读取标准输出
读取子进程和标准输出的正确方式是什么 这是我的档案:python子进程和读取标准输出,python,shell,subprocess,Python,Shell,Subprocess,读取子进程和标准输出的正确方式是什么 这是我的档案: traffic.sh code.py traffic.sh: sudo tcpdump -i lo -A | grep Host: code.py: proc = subprocess.Popen(['./traffic.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) # Do some network stuff like ping places, se
traffic.sh
code.py
traffic.sh:
sudo tcpdump -i lo -A | grep Host:
code.py:
proc = subprocess.Popen(['./traffic.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# Do some network stuff like ping places, send an email, open a few web pages and wait for them to finish loading
# Stop all traffic and make sure its over
data = proc.stdout.read()
proc.kill()
上面的代码有时有效,有时无效
当它失败时,其原因是由于被困在proc.stdout.read()上
我遵循了一系列示例,这些示例建议为proc设置一个线程和队列,并在proc写入时读取队列。然而,就其工作原理而言,这可能是间歇性的
我觉得我在杀戮和阅读方面做错了什么。因为我可以保证,当我打那个电话时,lo上不会发生任何通信,因此traffic.sh根本不应该打印任何内容
那么为什么读阻塞
有没有干净的线替代品
编辑
我也尝试过这样做,希望读取不会再阻塞,因为进程将被终止
proc = subprocess.Popen(['./traffic.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# Do some network stuff like ping places, send an email, open a few web pages and wait for them to finish loading
# Stop all traffic and make sure its over
proc.kill()
data = proc.stdout.read()
读取将继续,直到输入流关闭。当脚本中的管道仍在运行时,显然没有任何东西会关闭脚本的输出流(因此,子流程的输入流)。您实际希望的行为是什么?也许你只想读一行,而不是读所有的输入?如果是这种情况,请将管道末端置于
head-n1
@CharlesDuffy,我可以强制关闭管道吗?在读取之前,我也做了proc.kill()
,希望它会关闭。但是也有同样的问题,所以先有个延迟。是的,您需要先执行kill()
,然后才能执行阻塞读取。尽管阻塞读取是个糟糕透顶的主意,但它意味着tcpdump的输出受缓冲区大小的限制。@charlesduff。不行(请注意我的编辑。