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

python – 使用gzip文件作为stdin,用于使用subprocess.call执行的命令,第1张

概述我有一个 python脚本,使用subprocess.call()执行多个命令.我需要使用stdin将数据从gzip压缩文件传递给其中一个命令,但无论我做什么,该命令显然都会获取gzip压缩数据. 这是我认为应该工作的: import gzipfrom subprocess import callin_fname = 'test.gz'out_fname = 'test.txt'gz 我有一个 python脚本,使用subprocess.call()执行多个命令.我需要使用stdin将数据从Gzip压缩文件传递给其中一个命令,但无论我做什么,该命令显然都会获取Gzip压缩数据.

这是我认为应该工作的:

import gzipfrom subprocess import callin_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 gzipfrom subprocess import Popen,PIPEin_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)

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

总结

以上是内存溢出为你收集整理的python – 使用gzip文件作为stdin,用于使用subprocess.call执行的命令全部内容,希望文章能够帮你解决python – 使用gzip文件作为stdin,用于使用subprocess.call执行的命令所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存