使用gzip从子进程Popen调用中解压缩stdout

时间:2011-12-21 14:03:47

标签: python gzip subprocess pipe iostream

是否可以使用gzip直接解压缩通过subprocess.Popen触发的命令的stdout?

我试过这个,但它不起作用:

import subprocess
pipe = subprocess.Popen(["cat tmp.txt | gzip --stdout"], stdout=subprocess.PIPE)

import gzip
output = gzip.open(pipe.stdout)

while output.readline().rstrip():
    # Do something

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

可以通过创建将打开的文件而不是文件名传递给Python的gzip库 直接使用gzip.GzipFile实例,而不是使用帮助器gzip.open函数。但是,Python的gzip需要一个可搜索的文件,并且会在子进程使用的流上失败。

创建GzipFile实例的方法是

output = gzip.GzipFile(fileobj=pipe.stdout)

但是这不起作用,因为类需要一个可搜索的文件对象。如果等待所有子进程输出并将数据缓存在内存中没有问题,可以使用StringIO解决此问题,如:

import StringIO, subprocess
pipe = subprocess.Popen(["cat bla3.txt | gzip --stdout"], stdout=subprocess.PIPE, shell=True)
helper = StringIO.StringIO()     
helper.write(pipe.stdout.read())
helper.seek(0)
output = gzip.GzipFile(fileobj=helper) 

如果你不能这样做,你将不得不从Python的gzip.py复制一些代码,并自己处理数据并调用内部zlib。