Python的並發並行[3] -> 進程 -> subprocess 模塊
subprocess 模塊
0 模塊描述 / Module Description
From subprocess module:
"""Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes. For a complete description of this module see the Python documentation. Main API ======== run(...): Runs a command, waits for it to complete, then returns a CompletedProcess instance. Popen(...): A class for flexibly executing a command in a new process Constants --------- DEVNULL: Special value that indicates that os.devnull should be used PIPE: Special value that indicates a pipe should be created STDOUT: Special value that indicates that stderr should go to stdout Older API ========= call(...): Runs a command, waits for it to complete, then returns the return code. check_call(...): Same as call() but raises CalledProcessError() if return code is not 0 check_output(...): Same as check_call() but returns the contents of stdout instead of a return code getoutput(...): Runs a command in the shell, waits for it to complete, then returns the output getstatusoutput(...): Runs a command in the shell, waits for it to complete, then returns a (status, output) tuple"""
1 常量 / Constants
1.0 PIPE常量
常量數值: PIPE = -1
常量功能:一個特殊數值,表示需要創建一個pipe。將這個變量傳給stdout/stdin/stderr可以實現將子進程輸出傳給父進程
1.1 STDOUT常量
常量數值: STDOUT = -2
常量功能:一個特殊數值,表示stderr需要轉入stdout中
1.2 DEVNULL常量
常量數值: DEVNULL = -3
常量功能:一個特殊數值,表示需要使用os.devnull
2 函數 / Function
2.0 run()函數
函數調用: re = subprocess.run(*popenargs, input=None, timeout=None, check=False)
函數功能:創建新進程運行程序,返回新進程的CompletedProcess實例
傳入參數: *popenargs, input, timeout, check
*popenargs: list類型,調用新進程時使用的輸入
input: obj類型,用於設置新進程的輸入
timeout: int類型,設置超時時間限制,若進程用時太久,會引發TimeoutExpired
check: bool類型,檢測程序退出,若退出碼不是0,引發CalledProecssError
返回參數: re
re: instance類型,返回的CompletedProcess實例
2.1 call()函數
函數調用: re = subprocess.call(*popenargs, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
函數功能:創建新進程運行程序,輸入輸出綁定到父進程,返回新進程退出碼
傳入參數: *popenargs, stdin, stdout, stderr, shell, timeout
*popenargs: list類型,調用新進程時使用的輸入
stdin: obj類型,用於設置新進程的輸入
stdout: obj類型,用於設置新進程的輸出
stderr: obj類型,用於設置新進程的錯誤信息
shell: bool類型,設置是否使用中間shell來執行(可以使用shell相關變量等)
timeout: int類型,設置超時時間限制
返回參數: re
re: int類型,返回的退出碼,0為正常退出
Note: 對於新進程的輸入參數,以list形式傳入,例如命令python test.py,則傳入參數列表[‘python’, ‘test.py’]。
2.2 check_call()函數
函數調用: re = subprocess.check_call(*popenargs, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
函數功能:創建新進程運行程序,輸入輸出綁定到父進程,正常退出返回退出碼0,否則引發一個subprocess.CalledProcessError
傳入參數: *popenargs, stdin, stdout, stderr, shell, timeout
*popenargs: list類型,調用新進程時使用的輸入
stdin: obj類型,用於設置新進程的輸入
stdout: obj類型,用於設置新進程的輸出
stderr: obj類型,用於設置新進程的錯誤信息
shell: bool類型,設置是否使用中間shell來執行(可以使用shell相關變量等)
timeout: int類型,設置超時時間限制
返回參數: re
re: int類型,返回的退出碼,0為正常退出
2.3 getstatusoutput()函數
函數調用: re = subprocess.getstatusoutput(cmd)
函數功能:創建新進程運行程序,元組形式返回新進程退出碼和輸出
傳入參數: cmd
cmd: list類型,調用新進程時使用的輸入,[‘python’, ‘test.py’]形式
返回參數: re
re: tuple類型,返回的元組,包含退出碼和輸出
2.4 getoutput()函數
函數調用: re = subprocess.getoutput(cmd)
函數功能:創建新進程運行程序,字符串形式返回新進程的輸出
傳入參數: cmd
cmd: list類型,調用新進程時使用的輸入,[‘python’, ‘test.py’]形式
返回參數: re
re: str類型,返回的子進程輸出
2.5 check_output()函數
函數調用: re = subprocess.check_output(*popenargs, input=None, stdin=None,
stdout=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
函數功能:創建新進程運行程序,返回新進程的輸出
傳入參數: *popenargs, input, stdin, stdout, stderr, shell, universal_newlines, timeout
*popenargs: list類型,調用新進程時使用的輸入
Input: byte/str類型,一個額外可用的輸入,允許傳入一個字(b)符串給stdin
stdin: obj類型,用於設置新進程的輸入
stdout: obj類型,用於設置新進程的輸出
stderr: obj類型,用於設置新進程的錯誤信息
shell: bool類型,設置是否使用中間shell來執行(可以使用shell相關變量等)
universal_newlines: bool類型,設置輸入輸出的格式,False為byte,True為str
timeout: int類型,設置超時時間限制
返回參數: re
re: byte/str類型,返回的輸出結果
3 類 / Class
3.1 Popen類
類實例化:prcs = subprocess.Popen(args, stdin=None, stdout=None, stderr=None, […])
類的功能:用於生成一個新進程執行子程序
傳入參數: args
args: list類型,新進程執行的輸入
stdin: obj/int類型,用於設置新進程的輸入
stdout: obj/int類型,用於設置新進程的輸出
stderr: obj/int類型,用於設置新進程的錯誤信息
返回參數: prcs
prcs: instance類型,生成的新進程實例
Note: 對於新進程的輸入參數args,以list形式傳入,例如命令python test.py,則傳入參數列表[‘python’, ‘test.py’]。
3.1.1 pid屬性
屬性調用: pid = prcs.pid
屬性功能: 返回子進程的pid信息
屬性參數: pid
pid: int類型,子進程的pid
3.1.2 communicate()方法
函數調用: re = prcs.communicate(input=None, timeout=None)
函數功能:用於進程之間通信,發送數據到stdin,並從stdout和stderr讀取數據
傳入參數: input, timeout
input: byte/str類型,一個額外可用的輸入,允許傳入一個字(b)符串給stdin
timeout: int類型,設置超時時間限制
返回參數: re
re: tuple類型,返回的輸出結果,(stdout, stderr)
3.1.3 poll()方法
函數調用: re = prcs.poll()
函數功能:用於檢測子進程是否結束
傳入參數: 無
返回參數: re
re: int類型,返回的結果,為1則子進程已結束
3.2 CompletedProcess類
類實例化:re = subprocess.run() / CompletedProcess(args, returncode, stdout=None, stderr=None)
類的功能:一個已經完成運行的子進程,通常為調用subprocess.run()函數時返回生成
傳入參數: args, returncode, stdout, stderr
args: list類型,新進程執行的輸入
returncode: int類型,子進程的退出碼
stdout: obj/NoneType類型,子進程的輸出,如果沒獲取到則為None
stderr: obj/NoneType類型,子進程的錯誤信息,如果沒獲取到則為None
返回參數: re
re: instance類型,生成的已結束子進程實例
Python的並發並行[3] -> 進程 -> subprocess 模塊