subprocess最先在2.4版本引入。用來生成子進程,並能夠經過管道鏈接他們的輸入/輸出/錯誤,以及得到他們的返回值。html
# subprocess用來替換多箇舊模塊和函數 os.system os.spawn* os.popen* popen2.* commands.*
運行python的時候,咱們都是在建立並運行一個進程,linux中一個進程能夠fork一個子進程,並讓這個子進程exec另一個程序。在python中,咱們經過標準庫中的subprocess包來fork一個子進程,而且運行一個外部的程序。subprocess包中定義有數個建立子進程的函數,這些函數分別以不一樣的方式建立子進程,因此咱們能夠根據須要來從中選取一個使用。另外subprocess還提供了一些管理標準流(standard stream)和管道(pipe)的工具,從而在進程間使用文本通訊。python
1. calllinux
執行命令,返回狀態碼,shell = True容許shell命令時字符串形式shell
subprocess.check_call(["ls", "-l"]) subprocess.check_call("exit 1", shell=True)
2. check_callwindows
執行命令,若是執行狀態碼是0,則返回0,不然拋出異常函數
subprocess.check_call(["ls", "-l"]) subprocess.check_call("exit 1", shell=True)
3. check_output工具
執行命令,若是狀態碼是0,則返回執行結果,不然拋出異常ui
subprocess.check_output(["echo", "Hello World!"]) subprocess.check_output("exit 1", shell=True)
4. subprocess.Popen(...) spa
用於執行復雜的系統命令.net
參數:
執行普通命令:
import subprocess ret1 = subprocess.Popen(["mkdir","t1"]) ret2 = subprocess.Popen("mkdir t2", shell=True)
終端輸入的命令分爲兩種:
import subprocess obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) obj.stdin.write("print(1)\n") obj.stdin.write("print(2)") obj.stdin.close() cmd_out = obj.stdout.read() obj.stdout.close() cmd_error = obj.stderr.read() obj.stderr.close() print(cmd_out) print(cmd_error)
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) obj.stdin.write("print(1)\n") obj.stdin.write("print(2)") out_error_list = obj.communicate() print(out_error_list)
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out_error_list = obj.communicate('print("hello")') print(out_error_list)