溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

有關(guān)os.popen易忽略的知識(shí)點(diǎn)梳理

發(fā)布時(shí)間:2020-05-09 10:51:32 來(lái)源:億速云 閱讀:691 作者:Leah 欄目:編程語(yǔ)言

這篇文章主要介紹了在python中關(guān)于os.popen易忽略的知識(shí)點(diǎn)梳理,具有一定借鑒價(jià)值,需要的朋友可以參考下。如下資料是關(guān)于有關(guān)os.popen易忽略的知識(shí)點(diǎn)梳理內(nèi)容。

前言

使用python執(zhí)行一些命令或調(diào)用第三方工具是比較常見(jiàn)的情況,實(shí)現(xiàn)的方法也很多,如os.system(),os.popen()、subprocess模塊中的函數(shù)等等,本文主要介紹一下os.popen(),可能隱藏著你不曾接觸的知識(shí)點(diǎn),同時(shí)會(huì)結(jié)合實(shí)例進(jìn)行說(shuō)明,便于理解。

 

語(yǔ)法格式

首先我們看下os.popen的語(yǔ)法格式,如下:

os.popen(cmd, mode='r', buffering=-1)

 

參數(shù)說(shuō)明:

Command --- 調(diào)用的命令;

mode --- 模式權(quán)限可以是 'r'(默認(rèn)) 'w'

bufsize -- 指明了文件需要的緩沖大?。?/span>0意味著無(wú)緩沖;1意味著行緩沖;其它正值表示使用參數(shù)大小的緩沖(大概值,以字節(jié)為單位);負(fù)的bufsize意味著使用系統(tǒng)的默認(rèn)值。

 

官方釋義:

Open a pipe to or from command cmd. The return value is an open file object connected to the pipe, which can be read or written depending on whether mode is 'r' (default) or 'w'.

從命令cmd打開一個(gè)管道,返回值是連接管道的文件對(duì)象,通過(guò)該對(duì)象可以進(jìn)行讀或?qū)憽?/span>

 

知識(shí)點(diǎn)梳理

 

1.  返回值是文件對(duì)象

注意:返回值是文件對(duì)象既然是文件對(duì)象,使用完就應(yīng)該關(guān)閉,對(duì)吧?!不信網(wǎng)上搜一下,一大把文章提到這個(gè)os.popen都是忘記關(guān)閉文件對(duì)象的。 所以,推薦的寫法是:

  with os.popen(command, "r") as p:
    r = p.read()


     至于with的用法就不多講了,使用它,不需要顯式的寫p.close()。

 

2.  非阻塞

通俗的講,非阻塞就是os.popen不會(huì)等cmd命令執(zhí)行完畢就繼續(xù)下面的代碼了,不信?!看下面代碼實(shí)例:

有關(guān)os.popen易忽略的知識(shí)點(diǎn)梳理

從上面實(shí)例可知,os.popen執(zhí)行打開Uedit32.exe這個(gè)工具,但從實(shí)際執(zhí)行結(jié)果看,Uedit32.exe還沒(méi)打開,就直接進(jìn)入了下一條語(yǔ)句,打印了“hello 小蟒社區(qū)”。在某些應(yīng)用場(chǎng)景,可能這并不是你期望的行為,那如何讓命令執(zhí)行完后,再執(zhí)行下一句呢?

處理方法是使用read()readlines()對(duì)命令的執(zhí)行結(jié)果進(jìn)行讀操作。

 

3.  完全阻塞

上面寫了該函數(shù)是非阻塞的,現(xiàn)在怎么又變成完全阻塞的呢?感覺(jué)一頭霧水了吧。本質(zhì)上os.popen是非阻塞的,為了實(shí)現(xiàn)阻塞的效果,我們使用read()readlines()對(duì)命令結(jié)果進(jìn)行讀,由此產(chǎn)生了阻塞的效果。但是,如果你的命令執(zhí)行無(wú)法退出或進(jìn)入交互模式,這種“讀”將形成完全阻塞的情況,表現(xiàn)的像程序卡住了。

看下面代碼實(shí)例1

有關(guān)os.popen易忽略的知識(shí)點(diǎn)梳理

os.popen執(zhí)行了ping  127.0.0.1  -t 該命令會(huì)一直執(zhí)行,除非CTRL+C強(qiáng)制退出,因而,執(zhí)行readlines讀取命令輸出時(shí)會(huì)造成卡住。

 

代碼實(shí)例2

使用os.popen執(zhí)行sqlplus命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的場(chǎng)景,如果sqlplus執(zhí)行失敗,會(huì)進(jìn)入交互模式,如圖所示,此時(shí)使用readlines()讀取執(zhí)行結(jié)果時(shí)也會(huì)卡死,效果如上圖:

有關(guān)os.popen易忽略的知識(shí)點(diǎn)梳理

 

總結(jié)

os.popen()在大多數(shù)場(chǎng)景都是挺好用方便的,但是也有坑??! 具體應(yīng)用中,需要注意下。

建議:

1.       在需要讀取命令執(zhí)行結(jié)果時(shí),避免在命令無(wú)法退出或進(jìn)入交互模式的場(chǎng)景應(yīng)用os.popen;

2.       os.popen()無(wú)法滿足需求時(shí),可以考慮subprocess.Popen();

以上就是有關(guān)os.popen易忽略的知識(shí)點(diǎn)梳理,如果在日常工作遇到此問(wèn)題,希望你能通過(guò)這篇文章解決問(wèn)題。如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI