在Python中,我們可以使用subprocess模塊來運行其他進程。常見的例子包括在Python中運行一個外部命令,或者在Python代碼中啟動其他Python腳本。在這篇文章中,我們將深入介紹Python Subprocess Popen的使用方式和應用場景。
一、什麼是subprocess模塊
subprocess是Python標準庫中用於運行其他進程的模塊。它提供了一種方便的方法來運行系統命令,並且可以讀取命令的輸出和錯誤。subprocess模塊的Popen類是其主要介面。Popen類可以啟動一個新的進程並與其進行交互。
例如,我們可以通過以下代碼來啟動一個新的進程並等待其結束:
import subprocess subprocess.run(["ls", "-l"])
這段代碼通過subprocess模塊啟動了一個名為ls的程序,並傳遞了”-l”參數。run函數將會等待該程序執行完畢並返回一個CompletedProcess對象,該對象包含了程序的返回值、標準輸出和標準錯誤輸出。
二、使用Popen類運行其他進程
Popen類是subprocess模塊的主要介面,提供了一種方便的方法來啟動其他進程。
首先,我們需要通過Popen類構造一個新的進程對象。例如,我們可以通過以下代碼啟動一個新的Python進程:
import subprocess process = subprocess.Popen(["python", "script.py"])
在構造新的進程對象後,我們可以通過process對象來控制進程的行為。例如,我們可以使用communicate方法與進程進行交互,並獲取進程的輸出和錯誤輸出:
import subprocess process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE) output, error = process.communicate() print(output) print(error)
這段代碼會啟動一個名為ls的進程,並傳遞”-l”參數。stdout=subprocess.PIPE參數告訴Popen類將進程的輸出流管道化,以便我們可以通過communicate方法獲取進程的輸出和錯誤輸出。
三、高級應用:在Python中啟動非同步進程
在某些情況下,我們希望在Python中啟動非同步進程,並實時獲取進程的輸出流。這可能是因為我們要監控進程,在進程輸出特定的消息時執行某些操作,或者我們需要實時處理進程輸出生成結果。
為了實現這樣的需求,我們可以使用asyncio模塊和subprocess模塊的Popen類。非同步進程的啟動和輸出讀取將在事件循環中進行,以保持應用程序的反應靈敏性和可擴展性。
以下是一個簡單但完整的示例,演示了如何在Python中啟動非同步進程,並通過asyncio模塊實現與之交互:
import asyncio import sys import subprocess async def read_stream(stream, handler): while True: line = await stream.readline() if not line: break handler(line) def handler(line): sys.stdout.write(line.decode()) async def run_command(cmd): process = await asyncio.create_subprocess_exec(*cmd, stdout = asyncio.subprocess.PIPE, stderr = asyncio.subprocess.STDOUT) await asyncio.wait([ read_stream(process.stdout, handler), read_stream(process.stderr, handler) ]) loop = asyncio.get_event_loop() loop.run_until_complete(run_command(["ls", "-l"])) loop.close()
這段代碼啟動了一個名為ls的程序,並傳遞了”-l”參數。cmd參數包含了程序的名稱和參數,以列表形式傳遞給create_subprocess_exec方法。stdout和stderr參數告訴create_subprocess_exec方法將進程的輸出流和錯誤輸出流管道化,以便我們可以輕鬆地讀取它們。
用於讀取非同步進程輸出流的read_stream函數是非同步生成器。該函數將在協程中持續運行,直到進程輸出停止。當進程輸出新行時,read_stream生成器會將其傳遞給handler函數進行處理。在示例代碼中,handler函數僅將新行輸出到sys.stdout,但你可以根據需要修改它。
四、總結
Python Subprocess Popen是一個非常強大的工具,可以幫助我們在Python中輕鬆運行其他進程。subprocess模塊提供了一種方便的方法來運行系統命令,並且可以讀取命令的輸出和錯誤。使用Popen類可以啟動一個新的進程並與其進行交互。
在某些情況下,我們希望在Python中啟動非同步進程,並實時獲取其輸出流。為了實現這樣的需求,我們可以使用asyncio模塊和subprocess模塊的Popen類。非同步進程的啟動和輸出讀取將在事件循環中進行,以保持應用程序的反應靈敏性和可擴展性。
在實際開發中,subprocess模塊和Popen類的用途非常廣泛,它們可以幫助我們輕鬆處理各種任務,讓Python開發更加簡單、高效、靈活。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301149.html