【发布时间】:2019-04-12 12:03:33
【问题描述】:
按照 python doc 替换 shell-pipeline,我有一段看起来像这样的代码。
p1 = Popen(["tac" , "/var/log/some_process_log.output"], stderr=PIPE, stdout=PIPE)
p2 = Popen(["head", "-n", "1000"], stdin=p1.stdout, stdout=outfile)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
outfile 是我想要重定向head 命令输出的位置。日志文件非常大,因此我在上面做一个“头”
链接就像p1 | p2 | p3 | ..... | Pn > outfile
如果执行 p1 时出现错误,例如用户没有对/var/log/some_process_log.output 文件的读取权限,当我执行Pn.communicate() 时,p1.stderr 中的错误消息不会通过管道传输
如果我在每个阶段都执行 p1.stderr.readline(),那么它需要 long time to process。这在 pydocs 中有提到:
注意读取的数据是缓存在内存中的,如果有以下情况请不要使用此方法 数据量很大或无限制。
我避免使用 subprocess.check_output,因为它不处理管道,而且它需要不安全的 shell=True
任何帮助将不胜感激。谢谢
【问题讨论】:
标签: python subprocess pipe