“ 在進行Python/ target=_blank class=infotextkey>Python編程時,經常需要使用到操作系統的命令行,這就要求我們學會如何使用Python執行cmd命令。”
Python執行cmd命令的幾種方法
Python是一種強大而靈活的編程語言,它可以很方便地執行系統命令,與操作系統進行交互。本文將介紹Python執行cmd命令的幾種常用方法,以及它們的優缺點和使用場景。
1. 使用os模塊的os.system()函數
os模塊是Python標準庫中的一個模塊,它提供了一些與操作系統相關的函數和變量。其中,os.system()函數可以將字符串轉化成命令在服務器上運行,返回值是命令的退出狀態碼,0表示成功,1表示失敗,256表示沒有返回結果。例如:
import os
a = os.system("ping 192.168.1.101") # 使用a接收返回值
print(a)
這種方法的優點是簡單易用,不需要額外的模塊導入。缺點是無法獲取命令的輸出內容,只能獲取返回值;而且每次執行命令都會創建一個新的子進程,在資源消耗上比較大。
2. 使用os模塊的os.popen()函數
os.popen()函數也是os模塊中的一個函數,它可以通過管道的方式來執行系統命令,返回值是一個文件對象,可以讀或者寫。如果需要讀取輸出內容,可以調用read()或readlines()方法。例如:
import os
a = os.popen("ipconfig") # 使用a接收返回值
print(a.read()) # 讀取輸出內容
這種方法的優點是可以獲取命令的輸出內容,并對其進行處理;缺點是無法獲取命令的返回值,而且也會創建新的子進程。
3. 使用subprocess模塊
subprocess模塊是Python從2.4版本開始引入的模塊,主要用來取代一些舊的模塊方法,如os.system、os.spawn、os.popen、commands.*等。官方推薦使用該模塊執行系統命令,subprocess模塊通過子進程來執行外部指令,并通過input/output/error管道,獲取子進程的執行結果。常用的函數有subprocess.Popen()、subprocess.call()、subprocess.run()等。
3.1 使用subprocess.Popen()
使用Popen可以創建進程,并與進程進行復雜的交互。它接受一個命令或者一個命令列表作為參數,并返回一個Popen對象。通過調用Popen對象的communicate()方法可以獲取輸出和錯誤信息。例如:
import subprocess
# 使用Popen創建進程,并與進程進行復雜的交互
proc = subprocess.Popen(
'ipconfig', # cmd特定的查詢空間的命令
stdin=None, # 標準輸入 鍵盤
stdout=subprocess.PIPE, # -1 標準輸出(演示器、終端) 保存到管道中以便進行操作
stderr=subprocess.PIPE, # 標準錯誤,保存到管道
shell=True)
outinfo, errinfo = proc.communicate() # 獲取輸出和錯誤信息
print(outinfo.decode('gbk')) # 外部程序 (windows系統)決定編碼格式
print(errinfo.decode('gbk'))
這種方法的優點是可以靈活地控制輸入和輸出,并與子進程進行交互;缺點是參數比較復雜,而且需要注意編碼格式。
3.2 使用subprocess.call()
使用call執行指定的命令,返回命令執行狀態,功能類似os.system()函數,參數shell默認為False。例如:
import subprocess
# 使用call執行指定的命令,返回命令執行狀態
subprocess.call(['df', '-h']) # 數組作為參數運行命令
這種方法的優點是可以獲取命令的返回值,并且不需要指定shell參數;缺點是無法獲取命令的輸出內容。
3.3 使用subprocess.run()
subprocess.run()是Python3.5中新增的函數,執行指定的命令,返回一個包含執行結果的CompletedProcess類的實例。通過訪問CompletedProcess類的屬性和方法可以獲取更多信息。例如:
import subprocess
# 使用run執行指定的命令,返回一個包含執行結果的CompletedProcess類的實例
result = subprocess.run(['ls', '-l'])
print(result.returncode) # 返回碼
print(result.stdout) # 標準輸出
print(result.stderr) # 標準錯誤
這種方法的優點是可以獲取更多信息,并且簡化了Popen類的使用;缺點是只適用于Python3.5及以上版本。
4. 使用cmd模塊
cmd模塊提供了一個簡單框架用于編寫面向行的命令解釋器。可以通過繼承Cmd類并實現do_*()方法來自定義解釋器類,并且封裝動作方法。例如:
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()
這種方法的優點是可以自定義自己的解釋器,并提供幫助信息和自動補全功能;缺點是需要編寫更多代碼,并且不適合復雜或者交互式的命令。
-
如果只需要簡單地執行一條無需輸出內容或者交互式輸入參數等功能時,則可使用os.system()函數。 -
如果需要獲取輸出內容,則可使用os.popen()函數或者subprocess.Popen()類。 -
如果需要獲取返回值,則可使用os.system()函數或者subprocess.call()函數。 -
如果需要與子進程進行復雜交互,則可使用subprocess.Popen()類。 -
如果需要自定義自己的解釋器,則可使用cmd模塊。
以上就是勇哥介紹的幾種常用操作cmd命令的方法,你學廢了嘛?