1. 程式人生 > >Python的並發並行[3] -> 進程 -> subprocess 模塊

Python的並發並行[3] -> 進程 -> subprocess 模塊

pre dev nbsp pos 通信 byte 退出碼 and nco

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 模塊