为了执行涉及管道多个进程的复杂 shell 命令,Python 的 subprocess 模块提供了创建和管理进程的功能。让我们探索如何使用 subprocess.Popen 来实现此目的。
提供的 shell 命令:
echo "input data" | awk -f script.awk | sort > outfile.txt
管道 echo "input 的输出data”进入 awk 进程,然后将其输出通过管道输送到排序进程。要使用 subprocess.Popen 进行模拟:
import subprocess p_awk = subprocess.Popen(["awk","-f","script.awk"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) p_sort = subprocess.Popen(["sort"], stdin=p_awk.stdout, stdout=subprocess.PIPE) stdout_data = p_sort.communicate(b"input data\n")[0]
在这种情况下,echo 命令被直接写入 p_awk 的 stdin 所取代,并且 stdout_data 包含排序后的输出。
虽然已接受的解决方案实现了管道目标,但建议考虑仅使用 Python 的方法如下图所示:
import subprocess awk_sort = subprocess.Popen("awk -f script.awk | sort > outfile.txt", stdin=subprocess.PIPE, shell=True) stdout_data = awk_sort.communicate(b"input data\n")[0]
这种方法将管道委托给 shell,简化了子流程代码。此外,在 Python 中重写 awk 脚本可以消除 awk 作为依赖项,从而生成更快、更简单的代码。
管道传输多个进程会带来复杂性和潜在的瓶颈。通过消除管道并在所有处理步骤中使用 Python,您可以获得以下好处:
以上是如何使用'subprocess.Popen”在 Python 中有效连接多个进程以及何时应该避免管道?的详细内容。更多信息请关注PHP中文网其他相关文章!