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...