gpt4 book ai didi

python - 将子进程的标准输出重定向到 2 个或更多子进程的标准输入

转载 作者:行者123 更新时间:2023-12-01 04:54:33 31 4
gpt4 key购买 nike

基本上我想学习如何使用一个子进程(例如proc1)的stdout作为stdin python 中的 2 个或多个其他子进程(例如 proc2proc3)。

嗨,我需要 zcat 一个 .gz 文件,并使用发送到 subprocess.PIPE 的输出来进行 cksum (unix 实用程序)和行计数。

我可以像这样在 bash 中做到这一点...

[hashroot@dev_server 12]$ zcat ABC_C_TPM_26122014.data.gz | tee >(wc -l) >(cksum)| tail -2
2020090579 112180
586

我想在 python 中做同样的事情。

一旦我这样做...

>>> import subprocess
>>> import os
>>> fl123 = 'ABC_C_TPM_26122014.data.gz'
>>> pqr123 = subprocess.Popen(['zcat', fl123], stdout=subprocess.PIPE)
>>> subprocess.check_output(['cksum'], stdin=pqr123.stdout)
b'4286000649 256100 \n'

现在 PIPE 是空的,那么在我不再执行 zcat 之前我将如何获得行数。

我可以通过在子进程中运行 zcat 两次,并将第一个 zcat 输出重定向到 wc -l 并将第二个 zcat 输出重定向到 校验和。但 zcat 是基于磁盘 IO 的,速度很慢。所以我想避免它。

最佳答案

在 Python 中实现 tee 命令的一个简单方法是手动写入子进程:

import gzip
from subprocess import Popen, PIPE

# zcat ABC_C_TPM_26122014.data.gz | tee >(wc -l) >(cksum)
with gzip.open("ABC_C_TPM_26122014.data.gz", "rb") as input_file:
wc = Popen(['wc', '-l'], stdin=PIPE, bufsize=1, close_fds=True)
cksum = Popen(['cksum'], stdin=PIPE, bufsize=1, close_fds=True)

line_count = 0
for line_count, line in enumerate(input_file, start=1):
wc.stdin.write(line)
cksum.stdin.write(line)
wc.stdin.close()
cksum.stdin.close()
wc.wait()
cksum.wait()
print("Line count in the parent: %d" % line_count)

如果输入中的行可能很大,那么您可以分块读取输入:chunk = input_file.read(chunk_size) 而不是逐行读取 (b'\n' )。

关于python - 将子进程的标准输出重定向到 2 个或更多子进程的标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27740689/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com