Python 在将其输送至子流程(例如gzip)之前,在sys.stdin处达到峰值

Python 在将其输送至子流程(例如gzip)之前,在sys.stdin处达到峰值,python,subprocess,Python,Subprocess,数据来自sys.stdin,但它可以是压缩的(gzip)或未压缩的 要解开这个谜团,可以看一看流的前4个字节。如果它们等于“\x1f\x8b\x08\x04”,则为gzip压缩文件 如果文件确实已压缩,可以使用以下方法对其进行解压缩: p = subprocess.Popen(['pigz','--stdout','--decompress' , sys.stdin], stdout=subprocess.PIPE) 但是,如果前4个字节已经被使用,pigz将以not-a-gzip-compr

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

要解开这个谜团,可以看一看流的前4个字节。如果它们等于“\x1f\x8b\x08\x04”,则为gzip压缩文件

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

p = subprocess.Popen(['pigz','--stdout','--decompress' , sys.stdin], stdout=subprocess.PIPE)
但是,如果前4个字节已经被使用,pigz将以not-a-gzip-compressed-file拒绝该流

如果没有.read(),如何从sys.stdin读取几个字节

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

EDIT2:我尝试使用中建议的Peek()类,但它导致错误:

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

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

我在py2上的可能重复,但我发现它可以在py3上与sys.stdin.buffer一起工作-很高兴知道:)