是否可以使用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
有什么想法吗?
答案 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。