Python-調用系統命令的方法

轉載自:https://baijiahao.baidu.com/s?id=1617741196740621222&wfr=spider&for=pc

  1. 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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章