subprocess


subprocess

subprocess 模塊主要用於創建子進程,並連接它們的輸入、輸出和錯誤管道,獲取它們的返回狀態。通俗地說就是通過這個模塊,你可以在 Python 的代碼里執行操作系統級別的命令,比如ipconfigdu -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.PIPEsubprocess.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)

通過s.stdin.write()可以輸入數據,而s.stdout.read()則能輸出數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM