python利用管道popen呼叫 exe進行互動

2021-06-18 17:14:24 字數 2404 閱讀 2132

python是典型的膠水語言,可以來做粘合複雜程式的應用,在終端上可以隨意地組合他和其它程式,作為乙個中間處理模組。

python可以利用subprocess這個模組來產生子程序,並連線到子程序的標準輸入/輸出/錯誤中去,還可以得到子程序的返回值。

如下

p = subprocess.popen(r'xx.exe',stdin = none,stdout=subprocess.pipe,stderr=subprocess.pipe,shell=true)

return_code = p.wait()

list = p.stdout.read().splitlines()

for i in range(len(list)): item = list[i]

注意:第乙個引數字串在windows下要加r,表示不轉義,以防有路徑時'\'被轉義

pipe管道是在類unix

作業系統(以及一些擴充套件,windows)中,管道(英語:pipeline

)是原始的軟體管道

:即是乙個由標準輸入輸出鏈結起來的程序集合,所以每乙個程序的輸出(stdout

)被直接作為下乙個程序的輸入(stdin

)。主要用到了subprocess.popen函式:

class 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)

args引數:

可以是乙個字串,可以是乙個包含程式引數的列表。要執行的程式一般就是這個列表的第一項,或者是字串本身。

如:subprocess.popen(["cat","test.txt"])

bufsize引數:

如果指定了bufsize引數作用就和內建函式open()一樣:0表示不緩衝,1表示行緩衝,其他正數表示近似的緩衝區位元組數,負數表示使用系統預設值。預設是0。

executable引數:

指定要執行的程式。它很少會被用到:一般程式可以由args 引數指定。如果shell=true ,executable 可以用於指定用哪個shell來執行(比如bash、csh、zsh等)。*nix下,預設是 /bin/sh ,windows下,就是環境變數 comspec 的值。windows下,只有當你要執行的命令確實是shell內建命令(比如dir ,copy 等)時,你才需要指定shell=true

,而當你要執行乙個基於命令列的批處理指令碼的時候,不需要指定此項。

stdin stdout和stderr:

stdin stdout和stderr,分別表示子程式的標準輸入、標準輸出和標準錯誤。可選的值有pipe或者乙個有效的檔案描述符(其實是個正整數)或者乙個檔案物件,還有none。如果是pipe,則表示需要建立乙個新的管道,如果是none,不會做任何重定向工作,子程序的檔案描述符會繼承父程序的。另外,stderr的值還可以是stdout,表示子程序的標準錯誤也輸出到標準輸出。

preexec_fn引數:

如果把preexec_fn設定為乙個可呼叫的物件(比如函式),就會在子程序被執行前被呼叫。(僅限*nix)

close_fds引數:

如果把close_fds設定成true,*nix下會在開子程序前把除了0、1、2以外的檔案描述符都先關閉。在 windows下也不會繼承其他檔案描述符。

shell引數:

如果把shell設定成true,指定的命令會在shell裡解釋執行。

cwd引數:

如果cwd不是none,則會把cwd做為子程式的當前目錄。注意,並不會把該目錄做為可執行檔案的搜尋目錄,所以不要把程式檔案所在目錄設定為cwd 。

env引數:

如果env不是none,則子程式的環境變數由env的值來設定,而不是預設那樣繼承父程序的環境變數。注意,即使你只在env裡定義了某乙個環境變數的值,也會阻止子程式得到其他的父程序的環境變數(也就是說,如果env裡只有1項,那麼子程序的環境變數就只有1個了)。

注意在windows下,api函式createprocess接受的是乙個字串。即使是列表形式的引數,也需要先合併成字串再傳遞給api函式。

則 subprocess.popen("xx.exe" shell=true)

相當於 subprocess.popen(」cmd.exe /c 「+「xx.exe」 shell=true)

一定要注意路徑問題

管道 popen與pclose(二)

includefile popen const char command,const char type 建立管道並啟動command的程序 type r 將呼叫程序讀進command的標準輸出 type w 將呼叫程序寫到command的標準輸入 注意 呼叫popen不對標準錯誤輸出做任何處理,只...

利用popen執行linux程式

要想遠端執行伺服器上的程式,使用socket呼叫popen函式是個不錯的選擇 popen使用fifo管道執行外部程式。include file popen const char command,const char type int pclose file stream popen 通過type是r...

基於管道的popen和pclose函式

標準i o函式庫提供了popen函式,它啟動另外乙個程序去執行乙個shell命令列。這裡我們稱呼叫popen的程序為父程序,由popen啟動的程序稱為子程序。popen函式還建立乙個管道用於父子程序間通訊。子程序要麼從管道讀資訊,要麼向管道寫資訊,至於是讀還是寫取決於父程序呼叫popen時傳遞的引數...