轉載自:https://baijiahao.baidu.com/s?id=1617741196740621222&wfr=spider&for=pc
-
os.system()
該函數返回命令執行結果的返回值,system()
函數在執行過程中進行了以下三步操作:
1、fork一個子進程;
2、在子進程中調用exec
函數去執行命令;
3、在父進程中調用wait
(阻塞)去等待子進程結束。
返回0表示命令執行成功,其他表示失敗。
注意:使用該函數經常會莫名其妙地出現錯誤,但是直接執行命令並沒有問題,所以一般建議不要使用。
用法:os.system("command")
2.os.popen()
這種調用方式是通過管道的方式來實現,函數返回是 file read 的對象,對其進行讀取read、readlines等操作可以看到執行的輸出。
注意:如果命令執行失敗,就讀取不到內容。
用法:os.popen("command")
3.subprocess.Popen()
subprocess模塊被推薦用來替換一些老的模塊和函數,如:os.system、os.spawn、os.popen等
subprocess模塊目的是fork一個新的進程並與之通信,最常用是定義類Popen,使用Popen可以創建進程,並與進程進行復雜的交互。其函數原型爲:
class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
args:這個參數必須是字符串或者是一個由字符串成員的列表。其中如果是一個字符串列表的話,那第一個成員爲要運行的程序的路徑以及程序名稱;從第二個成員開始到最後一個成員爲運行這個程序需要輸入的參數。
executable:指定要運行的程序,這個一般很少用到,因爲要指定運行的程序在args中已經指定了。stdin,stdout ,stderr:分別代表程序的標準輸入、標準輸出、標準錯誤處理。可以選擇的值有PIPE,已經存在的打開的文件對象和NONE。若stdout是文件對象的話,要確保文件對象是處於打開狀態。
shell:默認是False。shell參數根據要執行的命令情況來定,如果將參數shell設爲True,executable將指定程序使用的shell。在windows平臺下,默認的shell由COMSPEC環境變量來指定。
bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝
cwd:用於設置子進程的當前目錄
stdin, stdout, stderr:分別表示程序的標準輸入、標準輸出、標準錯誤輸出,可以是 subprocess.PIPE 或 其他程序、文件。
env:用於指定子進程的環境變量。如果env = None,子進程的環境變量將從父進程中繼承。
universal_newlines:不同系統的換行符不同,True 即使用 \n
preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用。
用法: child = subprocess.Popen(["cmd","arg1"...])
subprocess.Popen類的實例可調用的方法
Popen.poll() 用於檢查子進程(命令)是否已經執行結束,沒結束返回None,結束後返回狀態碼。
Popen.wait(timeout=None) 等待子進程結束,並返回狀態碼;如果在timeout指定的秒數之後進程還沒有結束,將會拋出一個TimeoutExpired異常。
Popen.communicate(input=None, timeout=None) 該方法可用來與進程進行交互,比如發送數據到stdin,從stdout和stderr讀取數據,直到到達文件末尾。
Popen.send_signal(signal) 發送指定的信號給這個子進程。
Popen.terminate() 停止該子進程。
Popen.kill() 殺死該子進程。
其他函數
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
subprocess.run() Python 3.5中新增的函數。執行指定的命令,等待命令執行完成後返回一個包含執行結果的CompletedProcess類的實例。
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
subprocess.call() 執行指定的命令,返回命令執行狀態,其功能類似於os.system(cmd)。
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
subprocess.check_call() Python 2.5中新增的函數。 執行指定的命令,如果執行成功則返回狀態碼,否則拋出異常。其功能等價於subprocess.run(..., check=True)。
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
subprocess.check_output() Python 2.7中新增的的函數。執行指定的命令,如果執行狀態碼爲0則返回命令執行結果,否則拋出異常。
subprocess.getstatusoutput(cmd)
subprocess.getstatusoutput(cmd) 執行cmd命令,返回一個元組(命令執行狀態, 命令執行結果輸出),其功能類似於commands.getstatusoutput()。
subprocess.getoutput(cmd)
subprocess.getoutput(cmd) 接收字符串格式的命令,執行命令並返回執行結果,其功能類似於os.popen(cmd).read()和commands.getoutput(cmd)。