我正在使用python 2.6.4,发现无法将gzip与子进程一起使用,就像我希望的那样。这说明了问题:

May 17 18:05:36> python
Python 2.6.4 (r264:75706, Mar 10 2010, 14:41:19)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.

>>> import gzip
>>> import subprocess
>>> fh = gzip.open("tmp","wb")
>>> subprocess.Popen("echo HI", shell=True, stdout=fh).wait()
0
>>> fh.close()
>>>
[2]+  Stopped                 python
May 17 18:17:49> file tmp
tmp: data
May 17 18:17:53> less tmp
"tmp" may be a binary file.  See it anyway?
May 17 18:17:58> zcat tmp

zcat: tmp: not in gzip format


这是里面少了的样子

HI
^_<8B>^H^Hh<C0><F1>K^B<FF>tmp^@^C^@^@^@^@^@^@^@^@^@


看起来像将它作为文本放入标准输出中,然后放入一个空的gzip文件中。确实,如果删除“ Hi \ n”,则会得到以下信息:

May 17 18:22:34> file tmp
tmp: gzip compressed data, was "tmp", last modified: Mon May 17 18:17:12 2010, max compression


这里发生了什么?

更新:
这个先前的问题问的是同一件事:Can I use an opened gzip file with Popen in Python?

最佳答案

您不能在subprocess中使用类似文件的功能,只能使用真实文件。 fileno()GzipFile方法返回基础文件的FD,这就是echo重定向到的内容。然后关闭GzipFile,写入一个空的gzip文件。

10-04 21:44