Python-調用系統命令的方法

2020-12-07 linux運維菜

前言

在Python裡面,直接調用系統命令,可以快速的完成任務。一般使用os或者subprocess模塊,來執行系統命令。

os.system()

該函數返回命令執行結果的返回值,system()函數在執行過程中進行了以下三步操作:

1、fork一個子進程;

2、在子進程中調用exec函數去執行命令;

3、在父進程中調用wait(阻塞)去等待子進程結束。

返回0表示命令執行成功,其他表示失敗。

注意:使用該函數經常會莫名其妙地出現錯誤,但是直接執行命令並沒有問題,所以一般建議不要使用。

用法:os.system("command")

os.popen()

這種調用方式是通過管道的方式來實現,函數返回是 file read 的對象,對其進行讀取read、readlines等操作可以看到執行的輸出。

注意:如果命令執行失敗,就讀取不到內容。

用法:os.popen("command")

subprocess.Popen()

subprocess模塊被推薦用來替換一些老的模塊和函數,如:os.system、os.spawn*、os.popen*等

subprocess模塊目的是fork一個新的進程並與之通信,最常用是定義類Popen,使用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:這個參數必須是字符串或者是一個由字符串成員的列表。其中如果是一個字符串列表的話,那第一個成員為要運行的程序的路徑以及程序名稱;從第二個成員開始到最後一個成員為運行這個程序需要輸入的參數。

executable:指定要運行的程序,這個一般很少用到,因為要指定運行的程序在args中已經指定了。stdin,stdout ,stderr:分別代表程序的標準輸入、標準輸出、標準錯誤處理。可以選擇的值有PIPE,已經存在的打開的文件對象和NONE。若stdout是文件對象的話,要確保文件對象是處於打開狀態。

shell:默認是False。shell參數根據要執行的命令情況來定,如果將參數shell設為True,executable將指定程序使用的shell。在windows平臺下,默認的shell由COMSPEC環境變量來指定。

bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝

cwd:用於設置子進程的當前目錄

stdin, stdout, stderr:分別表示程序的標準輸入、標準輸出、標準錯誤輸出,可以是 subprocess.PIPE 或 其他程序、文件。

env:用於指定子進程的環境變量。如果env = None,子進程的環境變量將從父進程中繼承。

universal_newlines:不同系統的換行符不同,True 即使用 \n

preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用。

用法: child = subprocess.Popen(["cmd","arg1"...])

subprocess.Popen類的實例可調用的方法

Popen.poll() 用於檢查子進程(命令)是否已經執行結束,沒結束返回None,結束後返回狀態碼。

Popen.wait(timeout=None) 等待子進程結束,並返回狀態碼;如果在timeout指定的秒數之後進程還沒有結束,將會拋出一個TimeoutExpired異常。

Popen.communicate(input=None, timeout=None) 該方法可用來與進程進行交互,比如發送數據到stdin,從stdout和stderr讀取數據,直到到達文件末尾。

Popen.send_signal(signal) 發送指定的信號給這個子進程。

Popen.terminate() 停止該子進程。

Popen.kill() 殺死該子進程。

其他函數

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)

subprocess.run() Python 3.5中新增的函數。執行指定的命令,等待命令執行完成後返回一個包含執行結果的CompletedProcess類的實例。

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

subprocess.call() 執行指定的命令,返回命令執行狀態,其功能類似於os.system(cmd)。

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

subprocess.check_call() Python 2.5中新增的函數。 執行指定的命令,如果執行成功則返回狀態碼,否則拋出異常。其功能等價於subprocess.run(..., check=True)。

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)

subprocess.check_output() Python 2.7中新增的的函數。執行指定的命令,如果執行狀態碼為0則返回命令執行結果,否則拋出異常。

subprocess.getstatusoutput(cmd)

subprocess.getstatusoutput(cmd) 執行cmd命令,返回一個元組(命令執行狀態, 命令執行結果輸出),其功能類似於commands.getstatusoutput()。

subprocess.getoutput(cmd)

subprocess.getoutput(cmd) 接收字符串格式的命令,執行命令並返回執行結果,其功能類似於os.popen(cmd).read()和commands.getoutput(cmd)。

總結

subprocess是用來替代os.system等函數的,當subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()這些高級函數無法滿足需求時,我們可以使用subprocess.Popen類來實現我們需要的複雜功能。

相關焦點

  • Python執行系統命令的四種方法
    在子終端運行系統命令,可以獲取命令執行後的返回信息以及執行返回的狀態。 但是,如果簡單的通過encode(『gbk』)之類的方法,不能解決根本問題。 尤其是當我們根本不是使用print命令來輸出,而是控制臺默認輸出的情況下,是沒辦法修改os.system的編碼格式的,因為os.system執行命令返回的並不是命令中出現的文本,而是一個int,為0時表示成功,為1時表示異常。
  • 如何在Windows10系統用命令行方式快速調用資源監視器
    我們大家在運維管理Windows10計算機系統時,有時可能需要查看系統自帶的資源監視器。下面,小編就來演示一下如何通過命令行方式來快速調用的具體操作步驟,希望能對大家有所幫助。第一步:按住"Win+R"快捷鍵,打開"運行"窗口。第二步:輸入"cmd"指令。
  • python入門書籍推薦
    今天給大家分享一下python的入門書籍。筆者曾經讀書的時候,對編程特別感興趣,可是我本身不是學計算機的,所以編程只能看視頻自學。那時候,我接觸到的第一門語言是C++,就是學了很久,但是這門語言太過深奧,我學了幾個月,連一些基本的圖形開發也實現不了,後來,我就放棄編程了。
  • 超棒的 Python 版終端資源監控器!
    對於終端愛好者來說,擁有監控系統資源使用情況的能力同樣重要,了解系統的資源利用率有助於你在系統維護中做出明確的選擇,有一些工具可以藉助,諸如top和htop,但它們只顯示少數系統指標,如CPU和內存使用情況。
  • 十六本python入門學習書籍推薦,python入門新手必看
    《Python入門經典:以解決計算問題為導向的Python編程實踐》是一本系統而科學的Python入門教程,美國密西根州立大學等多所美國知名高校採用其作為程式語言的入門教材,被奉為經典。它不僅從計算機教學和計算機科學的角度講解了初學者如何才能更有效地去學習Python,而且特別強調用Python解決生活中的實際問題,精心組織了大量來源於生活中不同領域的與數值計算和數據處理相關的案例。
  • Python爬蟲入門之請求庫的安裝
    在抓取頁面的過程中,我們需要模擬瀏覽器向伺服器發出請求,所以需要用到一些python庫來實現HTTP請求操作。在爬蟲的講解過程中,我們將用到的第三方庫有requests、Selenium和aiohttp等。我們將先介紹這些請求庫的方法。
  • Python編程:開發工具(IDE)大匯總(附官方下載)
    最近有多位讀者留言,諮詢更便捷、高效的python編程開發工具(IDE),本文就給大家介紹四款業內常用的python軟體開發工具,並簡單介紹下每款軟體的特點,便於讀者按需選擇合適的學習軟體!Python安裝全過程詳解與驗證方法安裝pip安裝器,請參考往期文章:
  • win10用命令提示符來重置系統的方法
    win10電腦使用久了以後,常常會出現一些難以修復的系統問題,所以很多用戶都會選擇重置系統來解決。其中重置系統的方法有很多,有的用戶想要了解怎麼使用命令提示符重置win10系統,所以今天本文為大家整理分享的就是win10用命令提示符來重置系統的教程。
  • Win10正式版使用dism命令修復系統?解決方法
    安裝了 Windows10正式版 的電腦如果出現系統文件丟失等莫名奇妙問題的話,我們就可以懷疑系統重要文件可能已經被替換或是損壞了。除了可以使用SFC工具來修復受損系統外,我們還可以使用DISM命令來聯機修復系統文件。下面,小編就為大家分享具體方法。
  • 來一點Python面向對象第一級進階的東西
    python面向對象中的反射:通過字符串的形式操作對象相關屬性.python中的一切事物都是對象(都可以使用反射)四個可以實現自省的函數下列方法適用類和對象(一切皆對象,類本身也是一個對象)'我是str方法,列印對象時調用的就是我,我是存在於object類中' # 1試驗return'my name is %s' % self.name # 2試驗 解釋 %s相當於str() 實際上走的是__str__方法# a = Human() # 1試驗# print(a) # 1試驗
  • 關機命令應用實例
    電腦開關機的應用是比較常用的,除了用開關或者在開始菜單中選擇關機外,我們也可以用命令行或者腳本的方式進行關機。還可以設置定時關機操作。接下來就來了解一下具體的操作吧!用命令行實現關機首先,在開始運行中輸入CMD按回車或者窗口鍵+R鍵調用命令行窗口。
  • python第二課——Django(附300本強力學習電子書)
    為了達到這個目標,Django提供了通用Web開發模式的高度抽象,提供了頻繁進行的編程作業的快速解決方法,以及為「如何解決問題」提供了清晰明了的約定。 同時,Django 嘗試留下一些方法,來讓你根據需要在framework之外來開發。本書的目的是將你培養成Django專家。
  • Python科學計算入門書籍推薦
    結果翻遍了stackoverflow也沒找到合適的解決方法,都有點逼我差點試圖用C來重新編寫部分代碼了。不過最後發郵件求助在芝加哥的dask的開發團隊,得到一些幫助後花了兩三天時間寫了一大堆函數式和垃圾回收方面代碼,總算是差不多把這個問題解決了。內存和CPU被蜜汁優化了哈哈哈。。。
  • Python開發簡單爬蟲【學習資料總結】
    Python的網頁下載器 urllib2 (Python3以後將urllib2替換為urllib.request) requests urllib2 方法1:給定url,使用urllib2模塊的urlopen方法。
  • 慢步python,如何用python語言創造出一個真正的獨立exe程序?
    後有三種運行方式,這裡的編輯與運行,其實是依託IDE(集成開發環境 integrated development environment)與python解釋器的。這裡的python運行,如果沒有解釋器,你編輯的python代碼就無法運行。一個依靠集成解釋器運行的程序,不是獨立的程序。
  • Python的爬蟲基礎知識及安裝
    它是用C語言實現的,並能夠調用C庫(.so文件)。從一出生,Python已經具有了︰類,函數,異常處理,包含表和詞典在內的核心數據類型,以及模塊為基礎的拓展系統。現在主流是Python 3,所以我們現在學的也是Python 3大家可以看一下Python這幾年與其他編程的發展熱度趨勢Python的優點:最大的優點:開源即免費hhhhhhPython的缺點:(但是一般看不出來,除非超大型項目)Python的典型應用Python應用領域安裝python
  • 再搞不懂Python源碼就徹底掉隊了!
    但「打臉」的卻是只掌握了皮毛:  能用Python完成開發需求,但是經常調用各種庫,不懂更深的原理?  開發出來的程序邏輯上沒有問題,但是性能不夠好?  想爭取更好的工作機會,面試卻敗在了內部原理上。
  • 聊聊學python轉行、具體學習方法、自學python用於辦公、寫爬蟲等...
    那今天就來說說學python這件事兒吧,從三個方面來說:第一,學了python之後轉行找工作的問題;第二,具體的學習方法;第三,講講學了python之後應用於辦公自動化和寫爬蟲。4600字。關於恰飯:不用猜了,這篇依舊沒有廣告。其實之前有媒介找過我,說有機構覺得我寫的內容還不錯的,想投一點課程類的廣告,但是覺得我的閱讀量現在還是太少了,要再等等。
  • 猿神推薦的小白編程python一本書
    前言:why python?那些最好的程式設計師不是為了得到更高的薪水或者得到公眾的仰慕而編程,他們只是覺得這是一件有趣的事情。(呸,噁心。真他的噁心!別跟我談理想LZ就像搞錢!)開個小玩笑。並且,Python有很豐富的庫,其中有官方的,也有第三方開發的,你想做的功能模塊很有可能已經有人寫好了,你只需要調用,不需要重新發明輪子。這就像是擁有了智慧型手機,可以任意安裝需要的app。Python能做的事情有許多。
  • Go語言和Java、Python等其他語言的對比分析
    5、強大的標準庫這包括網際網路應用、系統編程和網絡編程。Go裡面的標準庫基本上已經是非常穩定了,特別是我這裡提到的三個,網絡層、系統層的庫非常實用。Go 語言的 lib 庫麻雀雖小五臟俱全。豆瓣就是拿python寫的。Python著名的伺服器框架有django,flask。但是python在大型項目上不太穩定,因此有些用python的企業後來遷移到了java上。scala編譯語言,比python快十倍,和java差不多,但是學習進度慢,而且在實際編程中,如果對語言不夠精通,很容易造成性能嚴重下降。,後來比如Yammer就從scala遷移到了java上。