在 Python 中要執行「指令」,以 Windows 為例就是 cmd (命令提示字元)、PowerShell ,筆者最常使用的方式就是透過 subprocess.check_output 來執行
範例輸出:
ㄜ...看起來好像執行成功但是又好像沒有成功...
這是因為筆者是使用 Windows 做示範,預設會使用 cmd 執行,以繁體中文來說會使用 big5 編碼,所以這裡需要使用 big5 編碼格式讀取:
範例輸出:
還有第二種方式:
其實只要在指令的最前面加上 powershell 即可, 在 cmd 中是沒有 ls 這個指定的,所以想要在 powershell 中執行 ls 指令可以使用下面的方式:
需要注意的是一樣要使用 big5 的編碼格式讀取
參考資料:
Python.docs - subprocess — Subprocess management
StackOverFlow - What is the difference between subprocess.run & 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?
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com