Python subprocess 建立子程序

2022-07-03 22:48:14 字數 2606 閱讀 3761

python提供多個建立子程序的模組,我比較習慣使用subprocess模組,因為在python手冊中有這樣一段話:

this module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*

subprocess被用來替換一些老的模組和函式,如:os.system、os.spawn*、os.popen*、popen2.*、commands.*。可見,subprocess是被推薦使用的模組。

1.os.system()

缺點:a. os.system() 是新起乙個shell去幹活的,對系統的開銷比較大

b. 獲得輸出等資訊比較麻煩,不能與外部命令或工具互動

c. 無法控制,(如果呼叫的外部命令,掛死或者執行時間很長),主程序無法控制os.system(), 因為呼叫os.system(cmd) 呼叫程序會block, until os.system() 自己退出

2.commands

優點:a. 容易獲得外部命令的輸出,已經退出狀態

缺點:同os.system()中的a,c

3.os.popen()

同commands命令

4.subprocess

優點:a.支援和子程序互動

b.支援同步/非同步方式執行子程序

c.可以子程序通訊

d.可自定義io管道

e.可控制是否開啟新的shell工作

…….subprocess模組中只定義了乙個類: popen。可以使用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)

引數說明:

subprocess.pipe

在建立popen物件時,subprocess.pipe可以初始化stdin, stdout或stderr引數。表示與子程序通訊的標準流。

subprocess.stdout

建立popen物件時,用於初始化stderr引數,表示將錯誤通過標準輸出流輸出。

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資訊。

Python subprocess 建立子程序

python提供多個建立子程序的模組,我比較習慣使用subprocess模組,因為在python手冊中有這樣一段話 this module intends to replace several other,older modules and functions,such as os.system o...

multuprocessing模組建立程序

1.需要將要執行的事情封裝為函式 2.使用multiprocessing模組中process類建立程序物件 3.通過物件屬性設定和process的初始化函式對程序進行設定,繫結要執行的函式 4.啟動程序,會自動執行程序繫結的函式 5.完成程序的 1.process 功能 建立程序物件 引數 name...

python子程序 Python實戰之子程序

最近做乙個小工具需要用到python的字程序,看了一下python的api,subprocess模組可以就可以實現,並且還挺簡單 要實現乙個簡單的自程序,只需要 import sys,os,subprocess p subprocess.popen ls l shell false,stdin no...