使用python的subprocess模塊調用linux系統命令

subprocess模塊主要有call()、check_call()、check_output()、Popen()函數,簡要描述以下:shell

Main 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 Popen(...): A class for flexibly executing a command in a new processwindows

Constants
---------
PIPE:    Special value that indicates a pipe should be created
STDOUT:  Special value that indicates that stderr should go to stdout

下面開始介紹subprocess函數的使用方法。緩存

(1)subprocess.Popen類函數

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)flex

參數說明:操作系統

args: 要調用的外部系統命令。 bufsize: 默認值爲0, 表示不緩存,。爲1表示行緩存,。其餘正數表示緩存使用的大小,,負數-1表示使用系統默認的緩存大小。 stdin、stdout、stdout 分別表示標準輸入、標準輸出和標準錯誤。其值能夠爲PIPE、文件描述符和None等。默認值爲None,表示從父進程繼承。 shell Linux:參數值爲False時,Linux上經過調用os.execvp執行對應的程序。爲Trule時,Linux上直接調用系統shell來執行程序。 Windows:shell參數表示是否使用bat做爲執行環境。只有執行windows的dir、copy等命令時才須要設置爲True。其餘程序沒有區別。 executable 用於指定可執行程序。通常狀況下咱們經過args參數來設置所要運行的程序。若是將參數shell設爲 True,executable將指定程序使用的shell。在windows平臺下,默認的shell由COMSPEC環境變量來指定。 preexec_fn 只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行以前被調用 cwd 設置子進程當前目錄 env env是字典類型,用於指定子進程的環境變量。默認值爲None,表示子進程的環境變量將從父進程中繼承。 Universal_newlines 不一樣操做系統下,文本的換行符是不同的。如:windows下用’/r/n’表示換,而Linux下用 ‘/n’。若是將此參數設置爲True,Python統一把這些換行符看成’/n’來處理。code

Popen對象對應的屬性和方法以下:對象

屬性: stdin, stdout, stderr, pid, returncode 方法: communicate(self, input=None) -> returns a tuple (stdout, stderr). wait(self) -> Wait for child process to terminate. Returns returncode attribute.繼承

經常使用實例進程

一、打印D:\temp目錄下建立test目錄。直接調用進程,不考慮獲取調用命令輸出內容和結果碼

import subprocess

p = subprocess.Popen(args='mkdir test', shell=True, cwd='d:/temp') p.wait()

二、調用ping命令執行,獲取命令執行輸出內容

import subprocess

p = subprocess.Popen(args='ping -n 2 -w 3 192.168.1.104', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) p.wait() print p.stdout.read()

說明:p.stdout、p.stdin、p.stderr爲文件對象,可使用文件對象函數,如read()。

(2)subprocess.call()

函數原型:call(*popenargs, **kwargs)。call()調用外部系統命令執行,並返回程序執行結果碼。

import subprocess

retcode = subprocess.call('ping -n 2 -w 3 192.168.1.104', shell=True) print retcode

(3)subprocess.check_call()

使用方法同call()。若是調用命令執行成功,返回結果碼0,若是執行失敗,拋出CalledProcessError.異常。舉例以下:

p = subprocess.check_call('ping -n 2 -w 3 192.168.1.105', shell=True)

正在 Ping 192.168.1.105 具備 32 字節的數據: 請求超時。 請求超時。

192.168.1.105 的 Ping 統計信息: 數據包: 已發送 = 2,已接收 = 0,丟失 = 2 (100% 丟失), Traceback (most recent call last): File "<stdin>", line 1, in <module> File "c:\Python27\lib\subprocess.py", line 186, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command 'ping -n 2 -w 3 192.168.1.105' returned non-zero exit status 1

(4)subprocess.check_output()

函數原型:check_output(*popenargs, **kwargs)。用法與call()相同。區別是若是執行成功返回的是標準輸出內容。若是失敗,拋CalledProcessError.異常。

import subprocess

output = subprocess.check_output('ping -n 2 -w 3 192.168.1.104', shell=True) print output

相關文章
相關標籤/搜索