subprocess 模塊主要用於創建子進程,並連接它們的輸入、輸出和錯誤管道,獲取它們的返回狀態。通俗地說就是通過這個模塊,你可以在 Python 的代碼里執行操作系統級別的命令,比如ipconfig
、du -sh
等。
大多數情況下,推薦使用run()方法調用子進程,執行操作系統命令,在更高級的使用場景,還可以調用Popen接口,其中run()方法在底層調用的就是Popen接口.
subprocess.run
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None)
功能,執行args參數所表示的命令,等待命令結束,返回一個CompletedProcess類型對象
注意:執行 args 參數所表示的命令,等待命令結束,並返回一個 CompletedProcess 類型對象.
args:
表示要執行的命令,必須是一個字符串,字符串參數列表
stdin,stdout和stderr:
子進程的標准輸入,輸出和錯誤.值可以是subprocess.PIPE
、subprocess.DEVNULL
、一個已經存在的文件描述符、已經打開的文件對象或者 None。
subprocess.PIPE
表示為子進程創建新的管道,subprocess.DEVNULL
表示使用os.devnull
。默認使用的是 None,表示什么都不做。另外,stderr 可以合並到 stdout 里一起輸出
timeout
設置命令超時時間。如果命令執行時間超時,子進程將被殺死,並彈出TimeoutExpired
異常。
check
如果該參數設置為 True,並且進程退出狀態碼不是 0,則彈出CalledProcessError
異常。
encoding
如果指定了該參數,則stdin、stdout 和 stderr 可以接收字符串數據,並以該編碼方式編碼。否則只接收 bytes 類型的數據。
shell
如果該參數為True,將通過操作系統的shell執行指定的命令
subprocess.CompletedProcess
run()方法的返回值,表示一個進程結束了,CompleteProcess類有下面這些屬性:
-
args 啟動進程的參數,通常是個列表或字符串
-
returncode 進程結束狀態返回碼,0表示成功狀態
-
設置了參數
stderr=subprocess.STDOUT
,則錯誤信息會和 stdout 一起輸出,此時 stderr 的值是 None。stdout獲取子進程的stdout,通常為bytes類型序列,None表示沒有捕獲值,如果在調用run()方法的時候, -
stderr 獲取子進程的錯誤信息。通常為 bytes 類型序列,None 表示沒有捕獲值。
-
check_returncode() 用於檢查返回碼。如果返回狀態碼不為零,彈出
CalledProcessError
異常。
subprocess.DEVNULL
一個特殊值,用於傳遞給 stdout、stdin 和 stderr 參數。表示使用os.devnull
作為參數值
subprocess.PIPE
管道,可傳遞給 stdout、stdin 和 stderr 參數
subprocess.STDOUT
特殊值,可傳遞給 stderr 參數,表示 stdout 和 stderr 合並輸出。
args與shell
args 參數可以接收一個類似'du -sh'
的字符串,也可以傳遞一個類似['du', '-sh']
的字符串分割列表。shell 參數默認為 False,設置為 True 的時候表示使用操作系統的 shell 執行命令。
獲取執行結果
run()方法返回的是一個CompletedProcess類型對象,不能直接獲取我們想要的結果,要想獲取想要執行的結果或者信息,在調用run方法的時候,指定stdout=subprocess.PIPE
subprocess.Popen()
用法和參數run()方法基本相同,但是他的返回值是一個Popen對象,而不是CompletedProcess對象
Popen對象的stdin,stdout,stderr是三個文件的句柄,可以像文件那樣進行讀寫操作
要實現python命令功能,可以按一下操作
import subprocess
s = subprocess.Popen("python", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
s.stdin.write(b"import os\n")
s.stdin.write(b"print(os.environ)")
s.stdin.close()
out = s.stdout.read().decode("GBK")
s.stdout.close()
print(out)