天天看點

python 執行shell_用Python調用Shell指令

Python經常被稱作“膠水語言”,因為它能夠輕易地操作其他程式,輕易地包裝使用其他語言編寫的庫,也當然可以用Python調用Shell指令。

用Python調用Shell指令有如下幾種方式:

第一種:os.system

os.system("The command you want").

python 執行shell_用Python調用Shell指令
python 執行shell_用Python調用Shell指令

這個調用相當直接,且是同步進行的,程式需要阻塞并等待傳回。傳回值是依賴于系統的,直接傳回系統的調用傳回值,是以windows和linux是不一樣的。

第二種:os.popen

os.popen(command[,mode[,bufsize]])

先給大家看個例子

python 執行shell_用Python調用Shell指令

可以看出,popen方法通過p.read()擷取終端輸出,而且popen需要關閉close().當執行成功時,close()不傳回任何值,失敗時,close()傳回系統傳回值. 可見它擷取傳回值的方式和os.system不同。

第三種,使用commands ( python3失效)

根據你需要的不同,commands子產品有三個方法可供選擇。getstatusoutput, getoutput, getstatus。

commands.getstatusoutput(cmd) 傳回(status, output).

commands.getoutput(cmd) 隻傳回輸出結果

commands.getstatus(file) 傳回ls-ld file的執行結果字元串,調用了getoutput,不建議使用此方法

python 執行shell_用Python調用Shell指令

但是,如上三個方法都不是Python推薦的方法,而且在Python3中其中兩個已經消失。

第四種,subprocess《Python文檔中目前全力推薦》

subprocess使用起來同樣簡單:

直接調用指令,傳回值即是系統傳回。shell=True表示指令最終在shell中運作。Python文檔中出于安全考慮,不建議使用shell=True。建議使用Python庫來代替shell指令,或使用pipe的一些功能做一些轉義。官方的出發點是好的,不過真心麻煩了很多, so....

但是,我使用subprocess失敗了

>>> importsubprocess>>> subprocess.call("cat %s |grep %s > %s" % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out"))

Traceback (most recent call last):

File"", line 1, in File"/usr/lib64/python3.6/subprocess.py", line 287, incall

with Popen(*popenargs, **kwargs) as p:

File"/usr/lib64/python3.6/subprocess.py", line 729, in __init__restore_signals, start_new_session)

File"/usr/lib64/python3.6/subprocess.py", line 1364, in_execute_childraisechild_exception_type(errno_num, err_msg, err_filename)

FileNotFoundError: [Errno2] No such file or directory: 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out': 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out'

python 執行shell_用Python調用Shell指令

但是。。我可以直接運作在shell裡面:

python 執行shell_用Python調用Shell指令

同樣的 我用os.system 去運作,也确實産生了。。好奇

>>> importos>>> os.system("cat %s |grep %s > %s" % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out"))256

python 執行shell_用Python調用Shell指令

源碼研究:

python 執行shell_用Python調用Shell指令

這裡面最為重要的幾個參數是:.

args:要執行的shell指令,或者是指令的清單;

bufsize:緩沖區大小;。

stdin、stdout、stderr:表示程式的标準輸入、标準輸出以及錯誤輸出。

shell:是否直接執行指令,如果設定為True就表示可以直接執行;

cwd:目前的工作目錄;

env:子程序環境變量;

案例:

python 執行shell_用Python調用Shell指令

subprocess子產品裡面還有一項功能比較強大的支援在于可以直接使用标準輸入、标準輸出和錯誤輸出進行程序的資料通訊操作。

例如,在Python安裝完成之後都會存在有互動式的程式設計環境,那麼本次将通過程式調用互動式程式設計環境。

直接操作python指令行,在python指令行中直接輸入程式。

defmain():

subp_popen=subprocess.Popen("python.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

subp_popen.stdin.write("print('subp_popen.stdin.write1')\n".encode())

subp_popen.stdin.write("print('subp_popen.stdin.write2')\n".encode())

subp_popen.stdin.write(("print('subp_popen.stdin.write3'+1)").encode())

subp_popen.stdin.close()

cmd_out=subp_popen.stdout.read()

subp_popen.stdout.close()print(cmd_out.decode())

cmd_err=subp_popen.stderr.read()

subp_popen.stderr.close()print(cmd_err)if __name__ == '__main__':

main()

結果:

python 執行shell_用Python調用Shell指令