[Python] 使用 subprocess 執行外部指令

在 Python 中要執行「指令」,以 Windows 為例就是 cmd (命令提示字元)、PowerShell ,筆者最常使用的方式就是透過 subprocess.check_output 來執行

subprocess.check_output 使用示範

假設要使用 ipconfig 指令查看電腦的網路資訊:
    
result = subprocess.check_output('ping 8.8.8.8')
print(result)
    

範例輸出:
    
b'\r\nWindows IP \xb3]\xa9w\r\n\r\n\r\n\xa4A\xa4\xd3\xba\xf4\xb8\xf4\xa5d \xa4A\xa4\xd3\xba\xf4\xb8\xf4:\r\n\r\n   \xb4C\xc5\xe9\xaa\xac\xbaA . . . . . . . . . . . . .: \xb4C\xc5\xe9\xa4w\xa4\xa4\xc2_\xb3s\xbdu\r\n   \xb3s\xbdu\xafS\xa9w DNS \xa7\xc0\xbdX . . . . . . . . : \r\n\r\n\xa4A\xa4\xd3\xba\xf4\xb8\xf4\xa5d \xa4A\xa4\xd3\xba\xf4\xb8\xf4 2:\r\n\r\n   \xb4C\xc5\xe9\xaa\xac\xbaA . . . . . . . . . . . . .:
    

ㄜ...看起來好像執行成功但是又好像沒有成功...

這是因為筆者是使用 Windows 做示範,預設會使用 cmd 執行,以繁體中文來說會使用 big5 編碼,所以這裡需要使用 big5 編碼格式讀取:
    
result = subprocess.check_output("ipconfig", encoding='big5')
print(result)
    

範例輸出:
    
Windows IP 設定


乙太網路卡 乙太網路:

   媒體狀態 . . . . . . . . . . . . .: 媒體已中斷連線
   連線特定 DNS 尾碼 . . . . . . . . : 
    

還有第二種方式:
    
result = subprocess.check_output("ipconfig").decode("big5")
print(result)
    

使用 PowerShell 執行

剛剛有提到在 Windows 中預設是使用 cmd 執行,那能不能用 PowerShell 執行?

其實只要在指令的最前面加上 powershell 即可, 在 cmd 中是沒有 ls 這個指定的,所以想要在 powershell 中執行 ls 指令可以使用下面的方式:
    
result = subprocess.check_output("powershell ls").decode("big5")
print(result)
    

需要注意的是一樣要使用 big5 的編碼格式讀取

處理指令執行失敗

在執行指令的時候有可能出現錯誤,可以使用下面的方式做錯誤處理:
    
try:
    result = subprocess.check_output('ping 8.8.8.8', encoding='big5')
    print(result)
except subprocess.CalledProcessError as e:
    print(f"命令執行失敗,錯誤碼: {e.returncode}")
    print(f"錯誤輸出: {e.output}")
except Exception as e:
    print(f"發生未知錯誤: {e}")
    



參考資料:
Python.docs - subprocess — Subprocess management
StackOverFlow - What is the difference between subprocess.run & subprocess.check_output?

留言