1. 程式人生 > >Subprocess模塊(* * * *)

Subprocess模塊(* * * *)

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 Code

supprocess模塊的工具函數

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模塊(* * * *)