gzip.open 作为 subprocess.Popen 的标准输入

use*_*688 2 python subprocess

我正在尝试用 python 启动一个程序subprocess.Popen,并stdin成为一些常规文本文件,就像这样。

subprocess.Popen(args, stdout=stdoutFile, stderr=stderrFile, stdin=open(TEXT_FILE))
Run Code Online (Sandbox Code Playgroud)

而且效果很好。但如果我尝试打开压缩文件,我的过程就会失败。

import gzip
subprocess.Popen(args, stdout=stdoutFile, stderr=stderFile, stdin=gzip.open(GZFILE)) 
Run Code Online (Sandbox Code Playgroud)

我不知道为什么。我的进程认为它没有获取任何数据。

知道为什么吗?2个不应该可以互换吗?

fal*_*tru 5

如果传递 的返回值gzip.open(..),则其内部文件描述符将传递给该文件;从子进程中读取它将返回原始数据,而不是解压后的数据。

您需要将解压缩的数据传递到子进程的标准输入:

subprocess.Popen(args, stdout=stdoutFile, stderr=stderFile,, stdin=subprocess.PIPE)
with gzip.open(GZFILE) as f:
    shutil.copyfileobj(f, p.stdin)
# p.stdin.close()  # to denote the end of the file.
Run Code Online (Sandbox Code Playgroud)