Subprocess模塊(* * * *)
阿新 • • 發佈:2018-03-10
tput 新的 mman put os模塊 傳遞 command called cin
Subprocess模塊(* * * *)
當我們需要調用系統的命令的時候,最先考慮的os模塊。用os.system()和os.popen()來進行操作。但是這兩個命令過於簡單,不能完成一些復雜的操作,如給運行的命令提供輸入或者讀取命令的輸出,判斷該命令的運行狀態,管理多個命令的並行等等。這時subprocess中的Popen命令就能有效的完成我們需要的操作。
subprocess模塊允許一個進程創建一個新的子進程,通過管道連接到子進程的stdin/stdout/stderr,獲取子進程的返回值等操作。The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.
This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*
這個模塊一個類:Popen。
1 2 3 |
#Popen它的構造函數如下:
subprocess.Popen(args, bufsize = 0 , executable = None , stdin = None , stdout = None ,stderr = None , preexec_fn = None , close_fds = False , shell = False ,<br> cwd = None , env = None , universal_newlines = False , startupinfo = None , creationflags = 0 )
|
# 參數args可以是字符串或者序列類型(如:list,元組),用於指定進程的可執行文件及其參數。 # 如果是序列類型,第一個元素通常是可執行文件的路徑。我們也可以顯式的使用executeable參 # 數來指定可執行文件的路徑。在windows操作系統上,Popen通過調用CreateProcess()來創 # 建子進程,CreateProcess接收一個字符串參數,如果args是序列類型,系統將會通過 # list2cmdline()函數將序列類型轉換為字符串。 # # # 參數bufsize:指定緩沖。我到現在還不清楚這個參數的具體含義,望各個大牛指點。 # # 參數executable用於指定可執行程序。一般情況下我們通過args參數來設置所要運行的程序。如 # 果將參數shell設為True,executable將指定程序使用的shell。在windows平臺下,默認的 # shell由COMSPEC環境變量來指定。 # # 參數stdin, stdout, stderr分別表示程序的標準輸入、輸出、錯誤句柄。他們可以是PIPE, # 文件描述符或文件對象,也可以設置為None,表示從父進程繼承。 # # 參數preexec_fn只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將 # 在子進程運行之前被調用。 # # 參數Close_sfs:在windows平臺下,如果close_fds被設置為True,則新創建的子進程將不會 # 繼承父進程的輸入、輸出、錯誤管道。我們不能將close_fds設置為True同時重定向子進程的標準 # 輸入、輸出與錯誤(stdin, stdout, stderr)。 # # 如果參數shell設為true,程序將通過shell來執行。 # # 參數cwd用於設置子進程的當前目錄。 # # 參數env是字典類型,用於指定子進程的環境變量。如果env = None,子進程的環境變量將從父 # 進程中繼承。 # # 參數Universal_newlines:不同操作系統下,文本的換行符是不一樣的。如:windows下 # 用’/r/n’表示換,而Linux下用’/n’。如果將此參數設置為True,Python統一把這些換行符當 # 作’/n’來處理。 # # 參數startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的 # CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等。
簡單命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import subprocess
a = subprocess.Popen( ‘ls‘ ) # 創建一個新的進程,與主進程不同步
print ( ‘>>>>>>>‘ ,a) #a是Popen的一個實例對象
‘‘‘
>>>>>>> <subprocess.Popen object at 0x10185f860>
__init__.py
__pycache__
log.py
main.py
‘‘‘
# subprocess.Popen(‘ls -l‘,shell=True)
# subprocess.Popen([‘ls‘,‘-l‘])
|
subprocess.PIPE
在創建Popen對象時,subprocess.PIPE可以初始化stdin, stdout或stderr參數。表示與子進程通信的標準流。
1 2 3 4 5 6 |
import subprocess
# subprocess.Popen(‘ls‘)
p = subprocess.Popen( ‘ls‘ ,stdout = subprocess.PIPE) #結果跑哪去啦?
print (p.stdout.read()) #這這呢:b‘__pycache__\nhello.py\nok.py\nweb\n‘
|
這是因為subprocess創建了子進程,結果本在子進程中,if 想要執行結果轉到主進程中,就得需要一個管道,即 : stdout=subprocess.PIPE
subprocess.STDOUT
創建Popen對象時,用於初始化stderr參數,表示將錯誤通過標準輸出流輸出。
Popen的方法
View Codesupprocess模塊的工具函數
1 2 3 4 5 6 7 8 9 10 11 12 13 |
supprocess模塊提供了一些函數,方便我們用於創建進程來實現一些簡單的功能。
subprocess.call( * popenargs, * * kwargs)
運行命令。該函數將一直等待到子進程運行結束,並返回進程的returncode。如果子進程不需要進行交 互,就可以使用該函數來創建。
subprocess.check_call( * popenargs, * * kwargs)
與subprocess.call( * popenargs, * * kwargs)功能一樣,只是如果子進程返回的returncode不為 0 的話,將觸發CalledProcessError異常。在異常對象中,包 括進程的returncode信息。
check_output( * popenargs, * * kwargs)
與call()方法類似,以byte string的方式返回子進程的輸出,如果子進程的返回值不是 0 ,它拋出CalledProcessError異常,這個異常中的returncode包含返回碼,output屬性包含已有的輸出。
getstatusoutput(cmd) / getoutput(cmd)
這兩個函數僅僅在Unix下可用,它們在shell中執行指定的命令cmd,前者返回(status, output),後者返回output。其中,這裏的output包括子進程的stdout和stderr。
|
import subprocess #1 # subprocess.call(‘ls‘,shell=True) ‘‘‘ hello.py ok.py web ‘‘‘ # data=subprocess.call(‘ls‘,shell=True) # print(data) ‘‘‘ hello.py ok.py web 0 ‘‘‘ #2 # subprocess.check_call(‘ls‘,shell=True) ‘‘‘ hello.py ok.py web ‘‘‘ # data=subprocess.check_call(‘ls‘,shell=True) # print(data) ‘‘‘ hello.py ok.py web 0 ‘‘‘ # 兩個函數區別:只是如果子進程返回的returncode不為0的話,將觸發CalledProcessError異常 #3 # subprocess.check_output(‘ls‘)#無結果 # data=subprocess.check_output(‘ls‘) # print(data) #b‘hello.py\nok.py\nweb\n‘
交互命令:
終端輸入的命令分為兩種:
- 輸入即可得到輸出,如:ifconfig
- 輸入進行某環境,依賴再輸入,如:python
需要交互的命令示例
待續
Subprocess模塊(* * * *)