subprocess意在替代其餘幾個老的模塊或者函數,好比:os.system os.spawn* os.popen* popen2.* commands.*
subprocess最簡單的用法就是調用shell命令了,另外也能夠調用程序,而且能夠經過stdout,stdin和stderr進行交互。python
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)
1)、args能夠是字符串或者序列類型(如:list,元組),用於指定進程的可執行文件及其參數。若是是序列類型,第一個元素一般是可執行文件的路徑。咱們也能夠顯式的使用executeable參數來指定可執行文件的路徑。shell
2)、bufsize:指定緩衝。0 無緩衝,1 行緩衝,其餘 緩衝區大小,負值 系統緩衝(全緩衝)編程
3)、stdin, stdout, stderr分別表示程序的標準輸入、輸出、錯誤句柄。他們能夠是PIPE,文件描述符或文件對象,也能夠設置爲None,表示從父進程繼承。windows
4)、preexec_fn只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行以前被調用。函數
5)、Close_sfs:在windows平臺下,若是close_fds被設置爲True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道。咱們不能將close_fds設置爲True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。spa
6)、shell設爲true,程序將經過shell來執行。操作系統
7)、cwd用於設置子進程的當前目錄code
8)、env是字典類型,用於指定子進程的環境變量。若是env = None,子進程的環境變量將從父進程中繼承。
Universal_newlines:不一樣操做系統下,文本的換行符是不同的。如:windows下用'/r/n'表示換,而Linux下用'/n'。若是將此參數設置爲True,Python統一把這些換行符看成'/n'來處理。startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等。對象
9)、startupinfo與createionflags只在windows下有效,它們將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等。blog
1)、Popen.poll():用於檢查子進程是否已經結束。設置並返回returncode屬性。
2)、Popen.wait():等待子進程結束。設置並返回returncode屬性。
3)、Popen.communicate(input=None):與子進程進行交互。向stdin發送數據,或從stdout和stderr中讀取數據。可選參數input指定發送到子進程的參數。Communicate()返回一個元組:(stdoutdata, stderrdata)。注意:若是但願經過進程的stdin向其發送數據,在建立Popen對象的時候,參數stdin必須被設置爲PIPE。一樣,若是但願從stdout和stderr獲取數據,必須將stdout和stderr設置爲PIPE。
4)、Popen.send_signal(signal):向子進程發送信號。
5)、Popen.terminate():中止(stop)子進程。在windows平臺下,該方法將調用Windows API TerminateProcess()來結束子進程。
6)、Popen.kill():殺死子進程。
7)、Popen.stdin:若是在建立Popen對象是,參數stdin被設置爲PIPE,Popen.stdin將返回一個文件對象用於策子進程發送指令。不然返回None。
8)、Popen.stdout:若是在建立Popen對象是,參數stdout被設置爲PIPE,Popen.stdout將返回一個文件對象用於策子進程發送指令。不然返回None。
9)、Popen.stderr:若是在建立Popen對象是,參數stdout被設置爲PIPE,Popen.stdout將返回一個文件對象用於策子進程發送指令。不然返回None。
10)、Popen.pid:獲取子進程的進程ID。
11)、Popen.returncode:獲取進程的返回值。若是進程尚未結束,返回None。
12)、subprocess.call(*popenargs, **kwargs):運行命令。該函數將一直等待到子進程運行結束,並返回進程的returncode。文章一開始的例子就演示了call函數。若是子進程不須要進行交互,就能夠使用該函數來建立。
13)、subprocess.check_call(*popenargs, **kwargs):與subprocess.call(*popenargs, **kwargs)功能同樣,只是若是子進程返回的returncode不爲0的話,將觸發CalledProcessError異常。在異常對象中,包括進程的returncode信息。
一、方式一
subprocess.Popen('腳本/shell', shell=True)
二、方式二
subprocess.call('腳本/shell', shell=True)
三、二者區別
二者的區別是前者無阻塞,會和主程序並行運行,後者必須等待命令執行完畢,若是想要前者編程阻塞能夠這樣
s = subprocess.Popen('腳本/shell', shell=True)
s.wait()
四、程序返回運行結果
>>> s = subprocess.Popen('ls -l', shell=True, stdout=subprocess.PIPE)
>>> s.communicate()
簡潔寫法:
>>> s = subprocess.check_output('ls -l', shell=True)
>>> s
前者能夠實現更多的交互,如stderr和stdin,可是在前面調用Popen的時候要實現定義Popen(stdin=subprocess.PIPE, stderr=subprocess)
五、給子進程輸入
import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")
()不爲空,則寫入subprocess.PIPE,爲空,則從subprocess.PIPE讀取
subprocess.PIPE
#!/usr/bin/env python
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)
其實是這樣的過程
child1.stdout-->subprocess.PIPE
child2.stdin<--subprocess.PIPE
child2.stdout-->subprocess.PIPE
要注意的是,communicate()是Popen對象的一個方法,該方法會阻塞父進程,直到子進程完成。