Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python子进程和读取标准输出_Python_Shell_Subprocess - Fatal编程技术网

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。不行(请注意我的编辑。