Python3之subprocess模塊

一.簡介

  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

參數:

  • args: 能夠是字符串或者序列類型(如:list, tuple)。默認的,要執行的程序應該是序列的第一個字段,若是是單個字符串,它的解析依賴於平臺。在unix中,若是args是一個字符串,那麼這個字符串解釋成被執行程序的名字或路徑,然而,這種狀況只能用在不須要參數的程序。
  • bufsieze: 指定緩衝。0表示無緩衝,1表示緩衝,任何其餘的整數值表示緩衝大小,負數值表示使用系統默認緩衝,一般表示徹底緩衝。默認值爲0即沒有緩衝。
  • stdin, stdout, stderr:分別表示程序的標準輸入,輸出,錯誤句柄
  • preexec_fn : 只在unix平臺有效,用於指定一個可執行對象,它將在子進程中運行以前被調用
  • close_fds : 在windows平臺下,若是close_fds被設置爲true,則新建立的子進程將不會繼承父進程的輸入,輸出,錯誤管道。因此不能將close_fds設置爲true同時重定向子進程的標準輸入,輸出與錯誤。
  • shell : 默認值爲False, 聲明瞭是否使用shell來執行程序,若是shell=True,它將args看作一個字符串,而不是一個序列。在unix系統中,且shell=True, shell默認使用/bin/sh。
  • cwd : 用於設置子進程的當前目錄。當它不爲None時,子程序在執行前,它的當前路徑會被替換成cwd的值。這個路徑並不會被添加到可執行程序的搜索路徑,因此cwd不能是相對路徑。
  • env : 用於指定子進程的環境變量。若是env=None,子進程的環境變量將從父進程中繼承。當它不爲None時,它是新進程的環境變量的映射。能夠用它來代替當前進程的環境。
  • universal_newlines : 不一樣系統的換行符不一樣, 文件對象stdout和stderr都被以文本文件的方式打開
  • startupinfo 與 createionflags只在windows下生效。將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等

執行普通命令:

import subprocess
ret1 = subprocess.Popen(["mkdir","t1"])
ret2 = subprocess.Popen("mkdir t2", shell=True)

終端輸入的命令分爲兩種:

  1. 輸入便可獲得輸出,如:ifconfig
  2. 輸入進行某環境,依賴在輸入,如: python
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)

備註:更多詳細關於subprocess點擊這裏

相關文章
相關標籤/搜索