一篇文章看懂python如何執(zhí)行cmd命令
概要
“ 在進(jìn)行Python編程時(shí),經(jīng)常需要使用到操作系統(tǒng)的命令行,這就要求我們學(xué)會(huì)如何使用Python執(zhí)行cmd命令。”
Python執(zhí)行cmd命令的幾種方法
Python是一種強(qiáng)大而靈活的編程語(yǔ)言,它可以很方便地執(zhí)行系統(tǒng)命令,與操作系統(tǒng)進(jìn)行交互。本文將介紹Python執(zhí)行cmd命令的幾種常用方法,以及它們的優(yōu)缺點(diǎn)和使用場(chǎng)景。
1. 使用os模塊的os.system()函數(shù)
os模塊是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,它提供了一些與操作系統(tǒng)相關(guān)的函數(shù)和變量。其中,os.system()函數(shù)可以將字符串轉(zhuǎn)化成命令在服務(wù)器上運(yùn)行,返回值是命令的退出狀態(tài)碼,0表示成功,1表示失敗,256表示沒(méi)有返回結(jié)果。例如:
import os a = os.system("ping 192.168.1.101") # 使用a接收返回值 print(a)
這種方法的優(yōu)點(diǎn)是簡(jiǎn)單易用,不需要額外的模塊導(dǎo)入。缺點(diǎn)是無(wú)法獲取命令的輸出內(nèi)容,只能獲取返回值;而且每次執(zhí)行命令都會(huì)創(chuàng)建一個(gè)新的子進(jìn)程,在資源消耗上比較大。
2. 使用os模塊的os.popen()函數(shù)
os.popen()函數(shù)也是os模塊中的一個(gè)函數(shù),它可以通過(guò)管道的方式來(lái)執(zhí)行系統(tǒng)命令,返回值是一個(gè)文件對(duì)象,可以讀或者寫(xiě)。如果需要讀取輸出內(nèi)容,可以調(diào)用read()或readlines()方法。例如:
import os a = os.popen("ipconfig") # 使用a接收返回值 print(a.read()) # 讀取輸出內(nèi)容
這種方法的優(yōu)點(diǎn)是可以獲取命令的輸出內(nèi)容,并對(duì)其進(jìn)行處理;缺點(diǎn)是無(wú)法獲取命令的返回值,而且也會(huì)創(chuàng)建新的子進(jìn)程。
3. 使用subprocess模塊
subprocess模塊是Python從2.4版本開(kāi)始引入的模塊,主要用來(lái)取代一些舊的模塊方法,如os.system、os.spawn、os.popen、commands.*等。官方推薦使用該模塊執(zhí)行系統(tǒng)命令,subprocess模塊通過(guò)子進(jìn)程來(lái)執(zhí)行外部指令,并通過(guò)input/output/error管道,獲取子進(jìn)程的執(zhí)行結(jié)果。常用的函數(shù)有subprocess.Popen()、subprocess.call()、subprocess.run()等。
3.1 使用subprocess.Popen()
使用Popen可以創(chuàng)建進(jìn)程,并與進(jìn)程進(jìn)行復(fù)雜的交互。它接受一個(gè)命令或者一個(gè)命令列表作為參數(shù),并返回一個(gè)Popen對(duì)象。通過(guò)調(diào)用Popen對(duì)象的communicate()方法可以獲取輸出和錯(cuò)誤信息。例如:
import subprocess # 使用Popen創(chuàng)建進(jìn)程,并與進(jìn)程進(jìn)行復(fù)雜的交互 proc = subprocess.Popen( 'ipconfig', # cmd特定的查詢空間的命令 stdin=None, # 標(biāo)準(zhǔn)輸入 鍵盤(pán) stdout=subprocess.PIPE, # -1 標(biāo)準(zhǔn)輸出(演示器、終端) 保存到管道中以便進(jìn)行操作 stderr=subprocess.PIPE, # 標(biāo)準(zhǔn)錯(cuò)誤,保存到管道 shell=True) outinfo, errinfo = proc.communicate() # 獲取輸出和錯(cuò)誤信息 print(outinfo.decode('gbk')) # 外部程序 (windows系統(tǒng))決定編碼格式 print(errinfo.decode('gbk'))
這種方法的優(yōu)點(diǎn)是可以靈活地控制輸入和輸出,并與子進(jìn)程進(jìn)行交互;缺點(diǎn)是參數(shù)比較復(fù)雜,而且需要注意編碼格式。
3.2 使用subprocess.call()
使用call執(zhí)行指定的命令,返回命令執(zhí)行狀態(tài),功能類似os.system()函數(shù),參數(shù)shell默認(rèn)為False。例如:
import subprocess # 使用call執(zhí)行指定的命令,返回命令執(zhí)行狀態(tài) subprocess.call(['df', '-h']) # 數(shù)組作為參數(shù)運(yùn)行命令
這種方法的優(yōu)點(diǎn)是可以獲取命令的返回值,并且不需要指定shell參數(shù);缺點(diǎn)是無(wú)法獲取命令的輸出內(nèi)容。
3.3 使用subprocess.run()
subprocess.run()是Python3.5中新增的函數(shù),執(zhí)行指定的命令,返回一個(gè)包含執(zhí)行結(jié)果的CompletedProcess類的實(shí)例。通過(guò)訪問(wèn)CompletedProcess類的屬性和方法可以獲取更多信息。例如:
import subprocess # 使用run執(zhí)行指定的命令,返回一個(gè)包含執(zhí)行結(jié)果的CompletedProcess類的實(shí)例 result = subprocess.run(['ls', '-l']) print(result.returncode) # 返回碼 print(result.stdout) # 標(biāo)準(zhǔn)輸出 print(result.stderr) # 標(biāo)準(zhǔn)錯(cuò)誤
這種方法的優(yōu)點(diǎn)是可以獲取更多信息,并且簡(jiǎn)化了Popen類的使用;缺點(diǎn)是只適用于Python3.5及以上版本。
4. 使用cmd模塊
cmd模塊提供了一個(gè)簡(jiǎn)單框架用于編寫(xiě)面向行的命令解釋器。可以通過(guò)繼承Cmd類并實(shí)現(xiàn)do_*()方法來(lái)自定義解釋器類,并且封裝動(dòng)作方法。例如:
import cmd class MyShell(cmd.Cmd): intro = 'Welcome to my shell. Type help or ? to list commands.\n' prompt = '(myshell) ' file = None def do_greet(self, arg): 'Greet the person' print(f'Hello {arg}!') def do_exit(self, arg): 'Exit the shell' print('Bye') return True if __name__ == '__main__': MyShell().cmdloop()
這種方法的優(yōu)點(diǎn)是可以自定義自己的解釋器,并提供幫助信息和自動(dòng)補(bǔ)全功能;缺點(diǎn)是需要編寫(xiě)更多代碼,并且不適合復(fù)雜或者交互式的命令。
總體來(lái)說(shuō):
如果只需要簡(jiǎn)單地執(zhí)行一條無(wú)需輸出內(nèi)容或者交互式輸入?yún)?shù)等功能時(shí),則可使用os.system()函數(shù)。
如果需要獲取輸出內(nèi)容,則可使用os.popen()函數(shù)或者subprocess.Popen()類。
如果需要獲取返回值,則可使用os.system()函數(shù)或者subprocess.call()函數(shù)。
如果需要與子進(jìn)程進(jìn)行復(fù)雜交互,則可使用subprocess.Popen()類。
如果需要自定義自己的解釋器,則可使用cmd模塊。
總結(jié)
到此這篇關(guān)于python如何執(zhí)行cmd命令的文章就介紹到這了,更多相關(guān)python執(zhí)行cmd命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)學(xué)習(xí)之時(shí)間轉(zhuǎn)換函數(shù)用法詳解
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)之時(shí)間轉(zhuǎn)換函數(shù)用法,結(jié)合實(shí)例形式分析了Python常見(jiàn)的日期時(shí)間獲取、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2019-06-06Django 開(kāi)發(fā)調(diào)試工具 Django-debug-toolbar使用詳解
這篇文章主要介紹了Django 開(kāi)發(fā)調(diào)試工具 Django-debug-toolbar使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python控制鼠標(biāo)鍵盤(pán)代碼實(shí)例
這篇文章主要介紹了Python控制鼠標(biāo)鍵盤(pán)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12Python的爬蟲(chóng)包Beautiful Soup中用正則表達(dá)式來(lái)搜索
這篇文章主要介紹了Python的爬蟲(chóng)包Beautiful Soup中用正則表達(dá)式來(lái)搜索的技巧,包括使用正則表達(dá)式去搜索多種可能的關(guān)鍵字以及查找屬性值未知的標(biāo)簽等,需要的朋友可以參考下2016-01-01Python中驚艷的一行代碼簡(jiǎn)潔強(qiáng)大表達(dá)力技巧實(shí)例
在Python中,語(yǔ)言的設(shè)計(jì)理念之一是簡(jiǎn)潔優(yōu)雅,這使得我們能夠用一行代碼完成一些令人驚嘆的任務(wù),本文將分享一些在一行代碼中展現(xiàn)出Python強(qiáng)大表達(dá)力的示例,涵蓋各種領(lǐng)域的實(shí)用技巧2024-01-01