Python模組subprocess小記

2021-07-03 09:26:10 字數 3040 閱讀 9373

在熟悉了qt的qprocess以後,再回頭來看python的subprocess總算不覺得像以前那麼恐怖了。

和qprocess一樣,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

字串或者列表

bufsize

0 無緩衝

1 行緩衝

其他正值 緩衝區大小

負值 採用預設系統緩衝(一般是全緩衝)

executable

一般不用吧,args字串或列表第一項表示程式名

stdin

stdout

stderr

none 沒有任何重定向,繼承父程序

pipe 建立管道

檔案物件

檔案描述符(整數)

stderr 還可以設定為 stdout

preexec_fn

鉤子函式, 在fork和exec之間執行。(unix)

close_fds

unix 下執行新程序前是否關閉0/1/2之外的檔案

windows下不繼承還是繼承父程序的檔案描述符

shell

為真的話

unix下相當於args前面新增了"/bin/sh「」-c」

window下,相當於新增"cmd.exe/c"

cwd設定工作目錄

env設定環境變數

universal_newlines

各種換行符統一處理成 '\n'

startupinfo

window下傳遞給createprocess的結構體

creationflags

windows下,傳遞create_new_console建立自己的控制台視窗

subprocess.popen(["gedit","abc.txt"]) subprocess.popen("gedit abc.txt")

這兩個之中,後者將不會工作。因為如果是乙個字串的話,必須是程式的路徑才可以。(考慮unix的api函式 exec,接受的是字串列表)

subprocess.popen("gedit abc.txt", shell=true)

這是因為它相當於

subprocess.popen(["/bin/sh", "-c", "gedit abc.txt"])

都成了sh的引數,就無所謂了

subprocess.popen(["notepad.exe", "abc.txt"]) subprocess.popen("notepad.exe abc.txt")

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

subprocess.popen("notepad.exe abc.txt" shell=true)

等價於

subprocess.popen("cmd.exe /c "+"notepad.exe abc.txt" shell=true)

模組還提供了幾個便利函式(這本身也算是很好的popen的使用例子了)

def call(*popenargs, **kwargs):     return popen(*popenargs, **kwargs).wait()

def check_call(*popenargs, **kwargs):     retcode = call(*popenargs, **kwargs)     if retcode:         cmd = kwargs.get("args")         raise calledprocesserror(retcode, cmd)     return 0

def check_output(*popenargs, **kwargs):     process = popen(*popenargs, stdout=pipe, **kwargs)     output, unused_err = process.communicate()     retcode = process.poll()     if retcode:         cmd = kwargs.get("args")         raise calledprocesserror(retcode, cmd, output=output)     return output

該物件提供有不少方法函式可用。而且前面已經用到了wait()/poll()/communicate()

poll()

檢查是否結束,設定返回值

wait()

等待結束,設定返回值

communicate()

引數是標準輸入,返回標準輸出和標準出錯

send_signal()

傳送訊號 (主要在unix下有用)

terminate()

終止程序,unix對應的sigterm訊號,windows下呼叫api函式terminateprocess()

kill()

殺死程序(unix對應sigkill訊號),windows下同上

stdin

stdout

stderr

引數中指定pipe時,有用

pid程序id

returncode

程序返回值

python之sys模組和subprocess模組

sys.path 可以把檔案路徑加入到環境變數 返回模組的搜尋路徑 返回模組的搜尋路徑,初始化時使用pythonpath環境變數的值 sys.argv 用來接收python直譯器執行py檔案後跟的引數 例如 python cp.py argv1 argv2 arg3 python直譯器執行 sys....

Python 系統命令呼叫之 subprocess

python 3不再推薦使用老的os.system os.popen commands.getstatusoutput 等方法來呼叫系統命令,而建議統一使用subprocess庫所對應的方法如 popen getstatusoutput call 標準用法使用資料傳參,可以用shlex庫來正確切割命...

python模組 python模組介紹

一 簡介 模組是乙個包含所有你定義的函式和變數的檔案,其字尾名是.py。模組可以被其他程式匯入來使用模組具有的功能。這也是使用python標準庫的方式。首先使用import匯入time包,這樣意味著我們能夠使用time包裡的所有公共內容。最後利用time包的相關計時功能計算出該程式執行時長。呼叫模組...