如何将 gzip 输出重定向到 Popen 标准输入

Posted

技术标签:

【中文标题】如何将 gzip 输出重定向到 Popen 标准输入【英文标题】:How to redirect gzip output to Popen stdin 【发布时间】:2020-02-06 15:07:50 【问题描述】:

如果我没有文件,如何将gzip解压的结果传递到进程stdin?

我发现,Popen 构造函数需要stdin 参数才能成为具有fileno 方法的对象。在 python2.7 中 gzip 没有 decompress 功能。还有,为什么Popen 不能接受没有fileno 的文件对象?

我试过这个代码

import subprocess
import gzip
import io

# To test with file
# with open('test.gz', 'rb') as f:
#    data = f.read()
data = b'...'

gz = gzip.GzipFile(mode='rb', fileobj=io.BytesIO(data))
subprocess.Popen(['cat'], stdin=gz)

但是有错误:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    subprocess.Popen(['cat'], stdin=gz)
  File "/usr/lib/python3.7/subprocess.py", line 728, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/usr/lib/python3.7/subprocess.py", line 1347, in _get_handles
    p2cread = stdin.fileno()
  File "/usr/lib/python3.7/gzip.py", line 334, in fileno
    return self.fileobj.fileno()
io.UnsupportedOperation: fileno

添加: 可以使用不同于Popen 和/或subprocess 的东西

【问题讨论】:

【参考方案1】:

您可以将其保存在文件中并将文件路径传递给 Popen 构造函数,我不确定它是否适用于 BytesIO 模块。

您可以关注this 问题,了解如何将输出保存到文件。

GLHF

【讨论】:

我考虑过使用临时文件。但这有点hacky 错误io.UnsupportedOperation: fileno 指的是您尝试使用fileno() 函数的变量类型,它仅适用于fileObjects,他期待一些可能的东西,而不是io.BytesIO,因为你正在通过。我认为您需要创建文件才能使用该模块。至少用with打开它,将字节读入文件并将文件变量传递给Popen。 是的,我明白为什么会出现错误。但问题是为什么Popen 只允许带有fileno 的文件对象,并且是否有可能以某种方式在没有文件的情况下将数据传递给处理。也许没有Popen 甚至没有subprocess

以上是关于如何将 gzip 输出重定向到 Popen 标准输入的主要内容,如果未能解决你的问题,请参考以下文章

将popen输出重定向到python中的文件

Linux用户

shell基础

重定向子进程标准输出

如何将 A 的标准输出重定向到 B 的标准输入,将 B 的标准输出重定向到 A 的标准输入?

linux shell数据重定向