【发布时间】:2016-04-25 05:53:02
【问题描述】:
我喜欢这个 shell 管道的 Python(2.6,抱歉!)等价物:
$ longrunningprocess | sometextfilter | gzip -c
也就是说,我要调用一个二进制longrunningprocess,通过sometextfilter过滤它的输出,需要得到gzip的输出。
我知道如何使用subprocess 管道,但我需要逐块输出管道(可能使用yield),而不是一次全部使用。例如。这
https://security.openstack.org/guidelines/dg_avoid-shell-true.html
仅适用于一次获取所有输出。
注意,longrunningprocess 和 sometextfilter 都是外部程序,不能用 Python 函数替换。
提前感谢任何提示或示例!
【问题讨论】:
-
在这种情况下 Python 在做什么?是文本过滤器吗?是压缩包吗?是不是只是在最后收集最终的输出?
-
不需要通过管道连接到系统 gzip...python 有一个内置的 gzip 接口(通过
gzip模块)。 -
而不是复杂的管道,听起来您只需要一个从标准输入读取并将压缩数据写入标准输出(或文件)的python程序。
-
当然,gzipping可以用Python来完成,但是
longrunningprocess和sometextfilter都是C程序,不能用Python重新实现。也就是说,Python 需要读取第一个进程的标准输出,将其通过管道传输到第二个进程的标准输入,最后 gzip 该进程的标准输出。我有点迷失如何在 Python 中做到这一点,而无需等待进程终止,这是无法完成的。 -
我看到两个独立的问题:How do I use subprocess.Popen to connect multiple processes by pipes? 以及如何以块的形式读取子进程的输出(如果您设置了
stdout=PIPE那么process.stdout是一个普通的(不可搜索的)文件对象,它具有相应的方法,例如chunk = process.stdout.read(chunk_size))。你试过什么?您的代码有哪些具体问题?
标签: python filter pipe subprocess yield