数据来自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)是。