首頁 > 軟體

Python如何執行系統命令

2020-09-23 15:03:51

一、背景說明

以前就感覺進步的速度和部落格的數量成正比,所以很長一段時間內想不通為什麼很多部落格為什麼到最後很少甚至不在更新了,直到最近自己也快成為斷更的一員。

這段時間其實碰到和解決了挺多典型的問題,但上班高負荷運轉下班沒心思週末覺得太耗費時間,就導致一直拖著沒寫。

但Python執行系統命令這個問題,從學Python之初就一直在困擾,到最近又反覆幾次在上邊遇到問題,實在是受不了。

二、Python執行系統命令的實現方式

2.1 執行命令不需要獲取命令輸出--os.system

有時候我們只需要執行命令並不需要獲取命令的執行輸出,此時我們就可以使用os.system()實現。

os.system()是C語言system()函數的封裝,返回命令的退出狀態碼,命令執行結果輸出到標準輸出(stdout/視窗)。

使用範例如下:

import os

command = "ifconfig"
exit_code = os.system(command)
# 理論上command是一個字串,但實際看command還是得變為位元組陣列
# 當命令中存在中文時可能會報編碼錯誤,此時可以自己給命令編一下碼
# exit_code = os.system(command.encode("gbk"))

參考:https://docs.python.org/3/library/os.html

2.2 執行系統命令並獲取命令輸出--os.popen()

如果我們想要獲取命令的輸出os.system()是不能實現的,此時可以使用os.popen()來實現。使用範例如下:

import os

command = "ifconfig"
command_output = os.popen(command).readlines()
print(command_output)

2.3 Python3更好的實現方式--subprocess

Python3引入了封裝程式更高的subprocess模組。使用範例如下:

import subprocess

command = "ifconfig"
# 命令如果帶引數則不能直接使用字串的形式,不然後報FileNotFoundError: [Errno 2] No such file or directory: 'ifconfig -a'等錯誤
# 此時有兩種處理辦法,一種是寫成以空格為分割的列表形式。可藉助shlex.split(command_line)實現自動分割
# command = ["ifconfig", "-a"]
# 別一種是將shell引數置為True
# completed_process_obj = subprocess.run(command, shell=True)
# 當設定了stdout引數,completed_process_obj的stdout屬性就會儲存命令的輸出
completed_process_obj = subprocess.run(command, stdout=subprocess.PIPE)
print(completed_process_obj.stdout.decode())
# subprocess.Popen()基礎引數和run()差不多,比run()對命令程序有更強的控制能力。其也能用來獲取命令輸出
# popen_obj = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
# print(popen_obj.stdout.readlines())
# 其他如subprocess.call()、subprocess.check_call()、subprocess.check_output()都是舊方法了,Python3.5+都建議用run()

參考:https://docs.python.org/3/library/os.html

以上就是Python如何執行系統命令的詳細內容,更多關於Python執行系統命令的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com