python模組之subprocess模組

2022-05-15 16:24:54 字數 4359 閱讀 5188

subprocess意在替代其他幾個老的模組或者函式,比如:os.system os.spawn* os.popen* popen2.* commands.*

subprocess最簡單的用法就是呼叫shell命令了,另外也可以呼叫程式,並且可以通過stdout,stdin和stderr進行互動。

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)

1)、args可以是字串或者序列型別(如:list,元組),用於指定程序的可執行檔案及其引數。如果是序列型別,第乙個元素通常是可執行檔案的路徑。我們也可以顯式的使用executeable引數來指定可執行檔案的路徑。

2)、bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝(全緩衝)

3)、stdin, stdout, stderr分別表示程式的標準輸入、輸出、錯誤控制代碼。他們可以是pipe,檔案描述符或檔案物件,也可以設定為none,表示從父程序繼承。

4)、preexec_fn只在unix平台下有效,用於指定乙個可執行物件(callable object),它將在子程序執行之前被呼叫。

5)、close_sfs:在windows平台下,如果close_fds被設定為true,則新建立的子程序將不會繼承父程序的輸入、輸出、錯誤管道。我們不能將close_fds設定為true同時重定向子程序的標準輸入、輸出與錯誤(stdin, stdout, stderr)。

6)、shell設為true,程式將通過shell來執行。

7)、cwd用於設定子程序的當前目錄

8)、env是字典型別,用於指定子程序的環境變數。如果env = none,子程序的環境變數將從父程序中繼承。

universal_newlines:不同作業系統下,文字的換行符是不一樣的。如:windows下用'/r/n'表示換,而linux下用'/n'。如果將此引數設定為true,python統一把這些換行符當作'/n'來處理。startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的createprocess()函式,用於設定子程序的一些屬性,如:主視窗的外觀,程序的優先順序等等。

9)、startupinfo與createionflags只在windows下有效,它們將被傳遞給底層的createprocess()函式,用於設定子程序的一些屬性,如:主視窗的外觀,程序的優先順序等等。

1)、popen.poll():用於檢查子程序是否已經結束。設定並返回returncode屬性。

2)、popen.wait():等待子程序結束。設定並返回returncode屬性。

3)、popen.communicate(input=none):與子程序進行互動。向stdin傳送資料,或從stdout和stderr中讀取資料。可選引數input指定傳送到子程序的引數。communicate()返回乙個元組:(stdoutdata, stderrdata)。注意:如果希望通過程序的stdin向其傳送資料,在建立popen物件的時候,引數stdin必須被設定為pipe。同樣,如果希望從stdout和stderr獲取資料,必須將stdout和stderr設定為pipe。

4)、popen.send_signal(signal):向子程序傳送訊號。

5)、popen.terminate():停止(stop)子程序。在windows平台下,該方法將呼叫windows api terminateprocess()來結束子程序。

6)、popen.kill():殺死子程序。

7)、popen.stdin:如果在建立popen物件是,引數stdin被設定為pipe,popen.stdin將返回乙個檔案物件用於策子程序傳送指令。否則返回none。

8)、popen.stdout:如果在建立popen物件是,引數stdout被設定為pipe,popen.stdout將返回乙個檔案物件用於策子程序傳送指令。否則返回none。

9)、popen.stderr:如果在建立popen物件是,引數stdout被設定為pipe,popen.stdout將返回乙個檔案物件用於策子程序傳送指令。否則返回none。

10)、popen.pid:獲取子程序的程序id。

11)、popen.returncode:獲取程序的返回值。如果程序還沒有結束,返回none。

12)、subprocess.call(*popenargs, **kwargs):執行命令。該函式將一直等待到子程序執行結束,並返回程序的returncode。文章一開始的例子就演示了call函式。如果子程序不需要進行互動,就可以使用該函式來建立。

13)、subprocess.check_call(*popenargs, **kwargs):與subprocess.call(*popenargs, **kwargs)功能一樣,只是如果子程序返回的returncode不為0的話,將觸發calledprocesserror異常。在異常物件中,包括程序的returncode資訊。

1、方式一

subprocess.popen('指令碼/shell', shell=true)

2、方式二

subprocess.call('指令碼/shell', shell=true)

3、兩者區別

兩者的區別是前者無阻塞,會和主程式並行執行,後者必須等待命令執行完畢,如果想要前者程式設計阻塞可以這樣

s = subprocess.popen('指令碼/shell', shell=true)

s.wait()

4、程式返回執行結果

>>> s = subprocess.popen('ls -l', shell=true, stdout=subprocess.pipe) 

>>> s.communicate()

簡潔寫法:

>>> s = subprocess.check_output('ls -l', shell=true)

>>> s

前者可以實現更多的互動,如stderr和stdin,但是在前面呼叫popen的時候要實現定義popen(stdin=subprocess.pipe, stderr=subprocess)

5、給子程序輸入

import subprocess

child = subprocess.popen(["cat"], stdin=subprocess.pipe)

child.communicate("vamei") 

()不為空,則寫入subprocess.pipe,為空,則從subprocess.pipe讀取

subprocess.pipe

#!/usr/bin/env python

import subprocess

child1 = subprocess.popen(["ls","-l"], stdout=subprocess.pipe)

child2 = subprocess.popen(["wc"], stdin=child1.stdout,stdout=subprocess.pipe)

out = child2.communicate()

print(out)

實際上是這樣的過程

child1.stdout-->subprocess.pipe

child2.stdin<--subprocess.pipe

child2.stdout-->subprocess.pipe

要注意的是,communicate()是popen物件的乙個方法,該方法會阻塞父程序,直到子程序完成。

python模組之shutil模組

高階的 檔案 資料夾 壓縮包 處理模組 shutil.copyfileobj fsrc,fdst length 將檔案內容拷貝到另乙個檔案中 import shutil shutil.copyfileobj open old.xml r open new.xml w shutil.copyfile ...

python模組之timeit模組

timeit模組用來測量函式執行時間,通過實際 學習怎樣應用timeit模組 fromtimeitimport print timeit x 7 print timeit x 7 number 1000000 print timeit x 7 number 1000000 print 上面三個列印說...

python模組 之 re模組

功能 實現python對正規表示式對支援與應用,將想要得到對內容按照正規表示式匹配出來 應用場景 爬蟲指令碼 對使用者輸入內容進行合規檢查 如qq格式檢查 等 功能 匹配物件中所有符合正規表示式的內容,並取出來 返回值 列表,所匹配到對項都會返回到列表中 import re content 1362...