加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 使用gzip文件作为stdin,用于使用subprocess.call执行

发布时间:2020-12-20 13:17:28 所属栏目:Python 来源:网络整理
导读:我有一个 python脚本,使用subprocess.call()执行多个命令.我需要使用stdin将数据从gzip压缩文件传递给其中一个命令,但无论我做什么,该命令显然都会获取gzip压缩数据. 这是我认为应该工作的: import gzipfrom subprocess import callin_fname = 'test.gz'out
我有一个 python脚本,使用subprocess.call()执行多个命令.我需要使用stdin将数据从gzip压缩文件传递给其中一个命令,但无论我做什么,该命令显然都会获取gzip压缩数据.

这是我认为应该工作的:

import gzip
from subprocess import call

in_fname = 'test.gz'
out_fname = 'test.txt'

gz = gzip.open(in_fname,'rb')
txt = open(out_fname,'w')

call(['cat'],stdin=gz,stdout=txt)

但最后,’test.txt’被压缩并且与gzip压缩输入文件具有完全相同的大小.

如果我调用gz.read(),那么我会按预期获得正确的解压缩数据.将gzip压缩文件用作stdin需要做什么?

解决方法

在做了一些研究之后,问题的根源在于你的操作系统不知道gzip文件的文件句柄是什么特别的事实.基本上,gzip提供了一个“类文件”接口,但子进程(在本例中为cat)并不知道这是一个需要解压缩的特殊文件.因此,它只读取字节的文件字节并打印出它读取的乱码.

我的下一个想法是在python中读取整个文件(它知道它已经压缩并将其解压缩),然后将字符串传递给子进程.我把解压缩的内容包裹在一个StringIO对象中,但事实证明这不起作用.另一个答案(Use StringIO as stdin with Popen)提到了一个稍微不同的子进程调用:

import gzip
from subprocess import Popen,PIPE

in_fname = 'test.gz'
out_fname = 'test.txt'

with gzip.open(in_fname,'rb') as f:
  gz = f.read()
txt = open(out_fname,'w')


process = Popen(['cat'],stdin=PIPE,stdout=txt)
process.communicate(gz)

哪个有效.请注意,这需要将整个文件读入内存,这可能是真正大文件的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读