使用subprocess.Popen()从stdout读取正在进行的进程输出

时间:2018-03-16 13:20:11

标签: python subprocess stdout

我想通过subprocess.Popen()和subprocess.communicate()

从代码(在后台运行)中读取已启动进程的正在输出

开始这个过程:

>>> (stdout, stderr) = proc.communicate()

tcpdump进程在后台运行,但proc.communicate()等到文件结束,只有当进程被终止时才会产生一些输出。

curl -s https://i.instagram.com/api/v1/users/USERID/info/ | jq -r .user.username

我希望在流程生成输出时从流程'stdout接收数据。 我想我需要一些线程来查看是否从进程生成了一些输出,然后将其附加到日志文件中。 我不知道该怎么做,所以任何想法和建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

tcpdump可能正在缓冲其输出。它只会在具有要写入的数据(通常为8KB)的缓冲区时写入输出。这是不写入TTY的程序的常见行为。

Tcpdump有一个命令行选项来对其输出进行行缓冲。这使得它在每次具有完整的文本行时写入其输出。试试这个:

process_params = ['/usr/bin/tcpdump', '-l', '-n', 'dst port 80']
                                       ^^--Line buffer output

或者,查看您的系统上是否安装了名为stdbufunbuffer的程序。它们可用于调整另一个进程的缓冲行为。或者看看这些问题: