outfile.txt 输-6ren">
gpt4 book ai didi

python - 如何使用 subprocess.Popen 通过管道连接多个进程?

转载 作者:IT老高 更新时间:2023-10-28 20:34:07 27 4
gpt4 key购买 nike

如何使用 Python subprocess 执行以下 shell 命令模块?

echo "input data" | awk -f script.awk | sort > outfile.txt

输入数据将来自一个字符串,所以我实际上不需要echo。我已经做到了这一点,谁能解释我如何让它通过 sort 进行管道传输?

p_awk = subprocess.Popen(["awk","-f","script.awk"],
stdin=subprocess.PIPE,
stdout=file("outfile.txt", "w"))
p_awk.communicate( "input data" )

更新:请注意,虽然下面接受的答案实际上并没有回答所问的问题,但我相信 S.Lott 是正确的,最好避免一开始就解决这个问题!

最佳答案

你会更高兴以下。

import subprocess

awk_sort = subprocess.Popen( "awk -f script.awk | sort > outfile.txt",
stdin=subprocess.PIPE, shell=True )
awk_sort.communicate( b"input data\n" )

将部分工作委托(delegate)给 shell。让它通过管道连接两个进程。

您会更高兴将“script.awk”重写为 Python,消除 awk 和管道。

编辑。建议 awk 没有帮助的一些原因。

[评论回复的理由太多了。]

  1. Awk 正在添加一个没有重要值(value)的步骤。 awk 的处理没有什么独特之处是 Python 无法处理的。

  2. 对于大型数据集,从 awk 到排序的流水线可能会缩短处理时间。对于短数据集,它没有显着的好处。 awk >file 的快速测量;排序文件awk | sort 将显示并发帮助。使用排序,它很少有帮助,因为排序不是一次性过滤器。

  3. “Python 到排序”处理(而不是“Python 到 awk 到排序”)的简单性避免了在这里提出确切类型的问题。

  4. Python - 虽然比 awk 更冗长 - 也是显式的,其中 awk 具有某些对新手不透明的隐含规则,并且让非专业人士感到困惑。

  5. Awk(就像 shell 脚本本身一样)添加了另一种编程语言。如果所有这些都可以用一种语言(Python)完成,那么消除 shell 和 awk 编程就消除了两种编程语言,让人们可以专注于任务中产生值(value)的部分。

底线:awk 不能增加重要的值(value)。在这种情况下,awk 是净成本;它增加了足够的复杂性,因此有必要提出这个问题。删除 awk 将是一个净 yield 。

侧边栏为什么构建管道 (a | b) 如此困难。

当shell遇到a | b 它必须执行以下操作。

  1. fork 原始 shell 的子进程。这最终会变成b。

  2. 构建一个操作系统管道。 (不是 Python subprocess.PIPE),而是调用 os.pipe(),它返回两个通过公共(public)缓冲区连接的新文件描述符。此时,该进程具有来自其父级的标准输入、标准输出、标准错误,以及一个将是“a 的标准输出”和“b 的标准输入”的文件。

  3. 叉一个 child 。 child 用新的 a 的标准输出替换它的标准输出。执行 a 进程。

  4. b 子关闭用新 b 的标准输入替换它的标准输入。执行 b 进程。

  5. b 子进程等待 a 完成。

  6. 父级正在等待 b 完成。

我认为上面可以递归地用来生成 a |乙 | c,但是你必须隐式地给长管道加上括号,把它们当作 a | (b | c).

由于Python有os.pipe()os.exec()os.fork(),你可以替换sys.stdinsys.stdout,有一种方法可以在纯 Python 中完成上述操作。实际上,您也许可以使用 os.pipe()subprocess.Popen 来制定一些快捷方式。

但是,将该操作委托(delegate)给 shell 会更容易。

关于python - 如何使用 subprocess.Popen 通过管道连接多个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/295459/

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