#輸出結果到屏幕上,並不返回執行狀態
os.system('dir')
#保存命令的執行結果輸出
ret = os.popen('dir').read()python
問題:上面2條是把命令結果保存下來了,可是返回狀態沒了,也就沒辦法判斷該命令是否執行成功。例如:shell
解決方式: 既想要執行結果郵箱要執行狀態請使用subprocess模塊。windows
注意:
在python2.7裏有個commands模塊,能夠經過commands.getstatusoutput("dir")查看系統命令的執行狀態,可是在3.5裏就已經棄用了。
在3.5裏新出了一個subprocess模塊來替換os.system、os.spawn*、 commands等模塊的功能。python2.7
做用:函數
1 #python解析shell命令: 2 subprocess.run(["df","-h"]) 3 4 #不用python解析shell命令:(shell=True) 5 subprocess.run("df -h |grep sda1",shell=True)
1、執行命令,返回狀態值,不返回結果:(call)spa
1 一、列表形式(shell = False) 2 ret = subprocess.call(["ls","-l"],shell=False) 3 print(ret) 4 5 二、字符串形式(shell=True) 6 ret = subprocess.call("ls -l",shell=True) 7 print(ret)
2、執行命令,若是狀態碼是0,則返回0,不然報異常,不反悔結果:(check_call)code
1 一、列表形式(shell = False) 2 ret = subprocess.check_call(["ls","-l"],shell=False) 3 print(ret) 4 5 二、字符串形式(shell=True) 6 ret = subprocess.check_call("ls -l",shell=True) 7 print(ret)
3、執行命令,若是狀態碼是 0 ,則返回執行結果,不然拋異常:(check_output)對象
1 一、列表形式(shell = False) 2 ret = subprocess.check_output(["echo","hello world"],shell=False) 3 print(ret) 4 5 二、字符串形式(shell=True) 6 ret = subprocess.check_output("exit 1",shell=True) 7 print(ret)
4、本地建立目錄:blog
使用subprocess.Popen(...) 用於執行復雜的系統命令(上面的方法在後臺實際就是調用的Popen)繼承
(二)、輸入便可獲得輸出,如:ifconfig
1 import subprocess 2 ret1 = subprocess.Popen(["mkdir","t1"]) 3 ret2 = subprocess.Popen("mkdir t2", shell=True)
5、跳轉到指定目錄而後在建立目錄:
輸入進行某環境,依賴再輸入,如:python
1 obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
6、經過管道進入交互方式:
1 import subprocess 2 3 #下面的stdin,stdout,stderr至關於三個管道,之後要想寫內容的時候經過管道就能夠寫。 4 obj = subprocess.Popen(["python"], #寫了一個python,就會進入python解釋器,obj就至關於定義一個對象。 5 stdin=subprocess.PIPE, #專門寫的管道1 6 stdout=subprocess.PIPE, #那正常結果的管道2 7 stderr=subprocess.PIPE, #用來拿錯誤的管道3 8 universal_newlines=True) 9 10 #向管道里面寫數據,下面2個print就至關於寫了2行數據。(至關於在終端把命令輸入進去了,剩下的就是拿結果) 11 obj.stdin.write("print(1)\n") 12 obj.stdin.write("print(2)") 13 obj.stdin.close() #表示中止寫入 14 15 #能夠到stdout的管道中取結果,讀到正常輸出的結果值 16 cmd_out = obj.stdout.read() 17 obj.stdout.close() 18 19 #若是出現錯誤,能夠到stderr中提取報錯結果 20 cmd_error = obj.stderr.read() 21 obj.stderr.close() 22 23 24 #最後輸出執行命令結果 25 print(cmd_out) 26 print(cmd_error)
7、合併stdout和stderr的輸入結果值:(communicate):
1 import subprocess 2 3 obj = subprocess.Popen(["python"], 4 stdin=subprocess.PIPE, 5 stdout=subprocess.PIPE, 6 stderr=subprocess.PIPE, 7 universal_newlines=True) 8 obj.stdin.write("print(1)\n") 9 obj.stdin.write("print(2)") 10 11 out_error_list = obj.communicate() #其實這個命令就是去stdout和stderr兩個管道里去拿返回out和error值,不用再次編輯。 12 print(out_error_list)
8、執行簡單的命令:
1 import subprocess 2 obj = subprocess.Popen(["python"], 3 stdin=subprocess.PIPE, 4 stdout=subprocess.PIPE, 5 stderr=subprocess.PIPE, 6 universal_newlines=True) 7 out_error_list = obj.communicate('print("hello")') 8 print(out_error_list)