在将它连接到子进程(例如gzip)之前在sys.stdin处达到峰值

时间:2017-04-13 17:50:31

标签: python subprocess

数据来自sys.stdin,但它可以是压缩(gzip)或未压缩。

要解决这个谜团,可以先看看流的前4个字节。如果他们等于" \ x1f \ x8b \ x08 \ x04"它是一个gzip压缩文件。

如果文件确实已压缩,可以使用以下命令对其进行解压缩:

p = subprocess.Popen(['pigz','--stdout','--decompress' , sys.stdin], stdout=subprocess.PIPE)

但是,如果已经消耗了前4个字节,则pigz将拒绝此流作为非-gzip压缩文件。

如何从sys.stdin中读取几个字节而不使用.read()?

或者,如何将pigz发送到正确的前4个字节然后发送其余的流而不会陷入死锁?

EDIT2:我尝试使用python 3: reading bytes from stdin pipe with readahead中建议的Peeker()类,但是会导致错误:

  File "./subprocess.py", line 1155, in _get_handles
    p2cread = stdin.fileno()
AttributeError: 'Peeker' object has no attribute 'fileno'

也许我需要创建一个命名管道,将四个字节写入其中,然后以某种方式将sys.stdin重定向到该命名管道。请注意,可能会有许多千兆字节的压缩数据进入,所以它必须有点自动,因为Popen(stdin = file_obj)是。

0 个答案:

没有答案