為了執行涉及管道多個進程的複雜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中文網其他相關文章!