網上不少教程,不少都是說的2時代的。html
這裏把3實驗過的命令記錄下來python
首先,若是隻須要執行,或者只須要獲得執行的狀態能夠用 os.system 調用shell
#!/usr/bin/env python3 print ('hello,world') # import os val2 = os.system('cd trb && cd trb') val3 = os.system('ls') print('val2 is ',val2)
上述代碼。若是val2內代碼執行成功,即有兩級trb文件夾,則val2 的值是0 不然是256bash
兩行調用沒有繼承性,若是要連續執行就在一個語句里加 && (Shell 語法)函數
在print以前,屏幕還會顯示執行的結果spa
hello,world sh: line 0: cd: trb: 沒有那個文件或目錄 Abcd.py automesh.sh Cal_Ori fold.txt Linux_py_temp.py meshedjob.rec new_geom onc143314 trb val2 is 256
#3d
os.popen(cmd)方法,只能獲得運行的輸出,可是若是不print屏幕上就什麼也沒有。code
例如htm
val4 = os.popen('cd trb && cd trb') val5 = os.popen('ls') print('開始PRINT') print(val4.read()) print(val5.read())
顯示以下對象
hello,world 開始PRINT /bin/sh: line 0: cd: trb: 沒有那個文件或目錄 Abcd.py automesh.sh Cal_Ori fold.txt Linux_py_temp.py meshedjob.rec new_geom onc143314 trb
這裏輸出是類文件的對象,要調用read或者readlines讀取也能夠用來遍歷。
###
終極武器,subprocess
py3.5後建議使用的模塊subprocess
網上教程裏的commands 是2裏的功能,在3裏被刪除,可是能夠經過subprocess調用
有如下命令:
subprocess.
getstatusoutput
(cmd )
在shell中返回執行cmd。(status, output) 返回2個元素的元組
3.4以後添加win支持
subprocess.
getoutput
(cmd )
執行cmd而後返回結果
legacycmd = subprocess.getstatusoutput('ls -l') print('subprocess.getstatusoutput 輸出',legacycmd) legacycmd2 = subprocess.getoutput('ls -l') print('subprocess.getoutput 輸出',legacycmd2)
上面爲代碼
輸出:
subprocess.getstatusoutput 輸出 (0, '總用量 48\n-rwxr--r-- 1 para036 bjpara 516 4月 16 2018 Abcd.py\n-rwxr--r-- 1 para036 bjpara 1619 4月 16 16:58 automesh_onpsn_fortest.sh\n-rwxr--r-- 1 para036 bjpara 1616 4月 15 14:31 automesh.sh\ndrwxr-xr-x 5 para036 bjpara 4096 4月 15 14:31 Cal_Ori\n-rw-r --r-- 1 para036 bjpara 32 4月 16 16:56 fold.txt\n-rwxr--r-- 1 para036 bjpara 1530 4月 15 14:45 Linux_py_temp.py\n-rw-r--r-- 1 para036 bjpara 27 4月 15 14:43 meshedjob.rec\ndrwxr-xr-x 2 para036 bjpara 4096 4月 15 14:31 new_geom\ndrwxr-xr-x 5 para036 bjpara 4096 4月 15 14:51 onc143314\ndrwx r-xr-x 5 para036 bjpara 4096 4月 16 17:05 onc16165650\ndrwxr-xr-x 5 para036 bjpara 4096 4月 16 16:46 onc163840\ndrwxr-xr-x 2 para036 bjpara 4096 4 月 15 14:32 trb') subprocess.getoutput 輸出 總用量 48 -rwxr--r-- 1 para036 bjpara 516 4月 16 2018 Abcd.py -rwxr--r-- 1 para036 bjpara 1619 4月 16 16:58 automesh_onpsn_fortest.sh -rwxr--r-- 1 para036 bjpara 1616 4月 15 14:31 automesh.sh drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:31 Cal_Ori -rw-r--r-- 1 para036 bjpara 32 4月 16 16:56 fold.txt -rwxr--r-- 1 para036 bjpara 1530 4月 15 14:45 Linux_py_temp.py -rw-r--r-- 1 para036 bjpara 27 4月 15 14:43 meshedjob.rec drwxr-xr-x 2 para036 bjpara 4096 4月 15 14:31 new_geom drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:51 onc143314 drwxr-xr-x 5 para036 bjpara 4096 4月 16 17:05 onc16165650 drwxr-xr-x 5 para036 bjpara 4096 4月 16 16:46 onc163840 drwxr-xr-x 2 para036 bjpara 4096 4月 15 14:32 trb
其中output是字符串。若是不print就不顯示
新的版本推薦使用subprocess.run() 來解決通常問題。
subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()都是經過對subprocess.Popen的封裝來實現的高級函數,所以若是咱們須要更復雜功能時,能夠經過subprocess.Popen來完成
run默認不會返回輸出,只返回命令和執行狀態
recomd = subprocess.run(['ls','-l']) #等待命令執行完成後會在屏幕輸出執行結果,而後返回一個包含執行結果的CompletedProcess類的實例。 print('輸出recmd\n',recomd) print(recomd.returncode)
輸出以下:
若是要返回輸出,要添加參數,傳遞subprocess.PIPE給stdout和stderr,而後能夠經過返回的CompletedProcess類實例的stdout和stderr屬性或捕獲相應的內容;
universal_newlines: 該參數影響的是輸入與輸出的數據格式,好比它的值默認爲False,此時stdout和stderr的輸出是字節序列;當該參數的值設置爲True時,stdout和stderr的輸出是字符串。
總代碼以下:
#!/usr/bin/env python3 print ('hello,world') # import os # val2 = os.system('cd trb && cd trb') # val3 = os.system('ls') # # print('val2 is ',val2) # val4 = os.popen('cd trb && cd trb') # # val5 = os.popen('ls') # print('開始PRINT') # print(val4.read()) # print(val5.read()) import subprocess recomd = subprocess.run(['ls','-l']) #等待命令執行完成後會在屏幕輸出執行結果,而後返回一個包含執行結果的CompletedProcess類的實例。 print('輸出recmd\n',recomd) print(recomd.returncode) print('傳遞參數') recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True) print('輸出outerr',recomdouterr.stdout,recomdouterr.stderr) print('傳遞參數2') recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,universal_newlines=True) print('輸出outerr',recomdouterr.stdout) print(len( recomdouterr.stdout.strip().split('\n') )) print(recomdouterr.stdout.strip().split('\n')[-1]) # legacycmd = subprocess.getstatusoutput('ls -l') # # print('subprocess.getstatusoutput 輸出',legacycmd) # # legacycmd2 = subprocess.getoutput('ls -l') # # print('subprocess.getoutput 輸出',legacycmd2)
參考資料:python3.5 官方文檔 : https://docs.python.org/3.5/library/subprocess.html
cnblogs:https://www.cnblogs.com/yyds/p/7288916.html