模塊講解----subprocess模塊

歷史

#輸出結果到屏幕上,並不返回執行狀態
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

 

 

 

subprocess模塊:

做用:函數

一、只獲取系統的狀態碼;
二、只獲取shell命令執行後的內容;
三、能夠經過Popen來設置一個路徑來增刪改查文件的操做;
四、能夠經過交互式的方式來添加和寫入內容操做;
 
 
在python3.5之後的版本可使用run,以前版本沒有run方法:
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)繼承

(一)、參數:
一、args:shell命令,能夠是字符串或者序列類型(如:list,元組)
二、bufsize:指定緩衝。0 無緩衝,1 行緩衝,其餘 緩衝區大小,負值 系統緩衝
三、stdin, stdout, stderr:分別表示程序的標準輸入、輸出、錯誤句柄
四、preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行以前被調用
五、close_sfs:在windows平臺下,若是close_fds被設置爲True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道。因此不能將close_fds設置爲True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。
六、shell:同上
七、cwd:用於設置子進程的當前目錄
八、env:用於指定子進程的環境變量。若是env = None,子進程的環境變量將從父進程中繼承。
九、universal_newlines:不一樣系統的換行符不一樣,True -> 贊成使用 \n
十、startupinfo與createionflags只在windows下有效將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等 。

 

(二)、輸入便可獲得輸出,如: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)
相關文章
相關標籤/搜索