Python 自動化與腳本應用:系統資訊(os、platform、psutil)
簡介
在日常的自動化腳本或 CLI 工具開發中,取得系統資訊是最常見的需求之一。無論是要根據作業系統選擇不同的指令、檢查磁碟空間、監控 CPU 使用率,或是偵測執行環境的 Python 版本,正確且快速地取得這些資訊,都能讓程式更具彈性與可靠性。
Python 內建的 os、platform 模組提供了跨平台的基礎資訊查詢,而功能更完整、更易於擴充的第三方套件 psutil,則讓我們可以深入到系統資源的即時監控。掌握這三個模組的使用方式,能讓你在撰寫自動化腳本時,輕鬆完成以下任務:
- 判斷執行環境(Windows / macOS / Linux)
- 取得檔案路徑、環境變數與工作目錄
- 監控 CPU、記憶體、磁碟與網路使用狀況
本文將從概念說明、實作範例、常見陷阱與最佳實踐,逐步帶你建立完整的系統資訊腳本。
核心概念
1. os 模組:作業系統層面的基本操作
os 是 Python 標準函式庫中最常用的模組之一,提供了 檔案與目錄操作、環境變數、執行子程序 等功能。以下列出幾個常見的屬性與函式:
| 功能 | 主要函式/屬性 | 說明 |
|---|---|---|
| 取得目前工作目錄 | os.getcwd() |
回傳字串,例如 C:\Users\Alice |
| 改變工作目錄 | os.chdir(path) |
變更當前工作目錄 |
| 列出目錄內容 | os.listdir(path='.') |
回傳檔案與子目錄列表 |
| 環境變數 | os.getenv(key, default=None) |
讀取環境變數 |
| 執行系統指令 | os.system(cmd)、os.popen(cmd) |
執行外部指令,返回狀態或輸出 |
小技巧:在跨平台腳本中,盡量使用
os.path(如os.path.join)來組合路徑,避免硬編碼斜線\或/。
2. platform 模組:辨識作業系統與硬體資訊
platform 提供了 更高層次的系統資訊,包括作業系統名稱、版本、處理器架構等。常用的函式包括:
platform.system()– 回傳'Windows'、'Linux'、'Darwin'(macOS)platform.release()– 作業系統的發行版號(如'10'、'5.4.0-42-generic')platform.version()– 完整的版本字串platform.machine()– 硬體平台(如'x86_64')platform.python_version()– 執行的 Python 版本
這些資訊在 條件分支(如不同 OS 執行不同指令)時非常有用。
3. psutil:即時系統資源監控的全能工具
psutil(process and system utilities)是一個跨平台的第三方套件,提供 CPU、記憶體、磁碟、網路、進程 等即時資訊。安裝方式:
pip install psutil
常見的 API:
| 功能 | 主要函式/屬性 | 說明 |
|---|---|---|
| CPU 使用率 | psutil.cpu_percent(interval=1) |
取得 CPU 使用率(%) |
| CPU 核心數 | psutil.cpu_count(logical=False) |
物理核心數 |
| 記憶體資訊 | psutil.virtual_memory() |
回傳 total, available, percent 等屬性 |
| 磁碟使用率 | psutil.disk_usage(path) |
取得磁碟空間使用情況 |
| 網路流量 | psutil.net_io_counters() |
取得傳送/接收位元組數 |
| 進程列表 | psutil.process_iter(attrs=None) |
迭代所有執行中的程式 |
注意:
psutil會直接呼叫底層系統 API,取得的數據通常比os/platform更精確,但在某些受限環境(如容器)可能需要額外權限。
程式碼範例
以下示範 5 個實用範例,涵蓋 os、platform、psutil 的核心功能。每段程式碼皆附有說明註解,方便直接貼上使用。
範例 1:取得並切換工作目錄
import os
# 取得當前工作目錄
current_dir = os.getcwd()
print(f"目前工作目錄: {current_dir}")
# 切換到使用者的 home 目錄
home_dir = os.path.expanduser("~")
os.chdir(home_dir)
print(f"已切換至: {os.getcwd()}")
說明:
os.path.expanduser("~")能在 Windows、Linux、macOS 都正確返回使用者的 home 目錄。
範例 2:列出系統環境變數與特定變數
import os
# 列出全部環境變數(僅示範前 5 筆)
for i, (key, value) in enumerate(os.environ.items()):
if i >= 5: break
print(f"{key} = {value}")
# 取得 PATH 變數,若不存在則回傳預設值
path_var = os.getenv("PATH", "")
print("\nPATH 變數長度:", len(path_var))
範例 3:辨識作業系統並執行對應指令
import platform
import os
system = platform.system()
print(f"偵測到的作業系統: {system}")
if system == "Windows":
# 使用 Windows 內建的 dir 指令
os.system("dir")
elif system == "Linux" or system == "Darwin":
# Linux/macOS 使用 ls -la
os.system("ls -la")
else:
print("未支援的作業系統")
重點:使用
platform.system()而非os.name,可得到更具可讀性的結果。
範例 4:使用 psutil 監控 CPU 與記憶體
import psutil
import time
def show_cpu_mem():
cpu = psutil.cpu_percent(interval=1) # 1 秒取樣
mem = psutil.virtual_memory()
print(f"CPU 使用率: {cpu}%")
print(f"記憶體使用率: {mem.percent}% ({mem.used // (1024**2)} MB / {mem.total // (1024**2)} MB)")
# 每 5 秒顯示一次
while True:
show_cpu_mem()
time.sleep(5)
說明:
psutil.cpu_percent(interval=1)會阻塞 1 秒以取得較準確的使用率;若傳入interval=0,則回傳瞬間值(但可能不準確)。
範例 5:取得磁碟與網路統計,並以表格方式輸出
import psutil
from tabulate import tabulate # pip install tabulate
# 磁碟使用率
disk = psutil.disk_usage('/')
disk_info = [
["磁碟路徑", "/"],
["總容量", f"{disk.total // (1024**3)} GB"],
["已使用", f"{disk.used // (1024**3)} GB"],
["剩餘", f"{disk.free // (1024**3)} GB"],
["使用率", f"{disk.percent}%"]
]
# 網路流量
net = psutil.net_io_counters()
net_info = [
["傳送位元組", f"{net.bytes_sent // (1024**2)} MB"],
["接收位元組", f"{net.bytes_recv // (1024**2)} MB"],
["傳送封包", net.packets_sent],
["接收封包", net.packets_recv]
]
print("=== 磁碟資訊 ===")
print(tabulate(disk_info, tablefmt="github"))
print("\n=== 網路資訊 ===")
print(tabulate(net_info, tablefmt="github"))
補充:
tabulate能讓輸出更易讀,非必要時可直接
常見陷阱與最佳實踐
| 陷阱 | 說明 | 解決方案 |
|---|---|---|
| 硬編碼路徑分隔符 | 直接使用 \ 或 / 會在跨平台時出錯。 |
使用 os.path.join()、os.path.sep,或 pathlib.Path。 |
忽略 psutil 的權限需求 |
在某些容器或受限帳號下,psutil 可能拋出 AccessDenied。 |
捕捉例外 psutil.AccessDenied,或以非特權方式取得資料(如僅讀 /proc)。 |
使用 os.system 直接拼接指令 |
可能造成 命令注入 或在特殊字元下失敗。 | 改用 subprocess.run([...], capture_output=True, text=True),並提供列表形式的參數。 |
| 過度頻繁的資源輪詢 | 每秒呼叫 psutil.cpu_percent() 會增加 CPU 負擔。 |
設定合理的輪詢間隔(如 5~10 秒),或使用事件驅動的監控方案。 |
| 忽視多核心 CPU | psutil.cpu_percent() 預設回傳所有核心的平均值。 |
若需每核心資料,使用 psutil.cpu_percent(percpu=True)。 |
最佳實踐:
- 抽象化系統資訊:將
os、platform、psutil的呼叫封裝在獨立的函式或類別,讓主程式只關心「我要什麼資訊」而非「怎麼取得」。 - 使用
pathlib:相較於os.path,pathlib.Path提供面向物件的路徑操作,更直觀且支援型別提示。 - 加入日誌:在自動化腳本中,使用
logging記錄取得的系統資訊與錯誤,有助於除錯與審計。 - 測試跨平台:在 CI/CD 流程加入 Windows、Linux、macOS 的測試,確保腳本在不同環境都能正常執行。
實際應用場景
| 場景 | 需求 | 可能的實作方式 |
|---|---|---|
| 部署前檢查 | 確認目標機器的 OS、Python 版本與磁碟空間是否符合需求。 | 使用 platform.system()、platform.python_version()、psutil.disk_usage(),產生檢查報告。 |
| 資源監控儀表板 | 定時收集 CPU、記憶體、網路流量,並推送至 Grafana/Prometheus。 | 透過 psutil 取得指標,使用 requests 上傳至 Pushgateway。 |
| 自動化測試環境清理 | 在測試結束後刪除特定目錄、釋放暫存檔。 | 利用 os.listdir()、os.remove()、shutil.rmtree() 搭配 platform.system() 判斷路徑。 |
| 跨平台 CLI 工具 | 根據 OS 使用不同的執行檔或指令。 | platform.system() 判斷後,呼叫 subprocess.run([...]) 執行相應的二進位檔。 |
| 安全稽核 | 檢查系統上是否有不允許的進程在執行。 | 使用 psutil.process_iter() 列舉所有進程,過濾出可疑名稱並記錄。 |
總結
本篇文章從 基礎的 os、platform 到 功能強大的 psutil,系統性說明了在 Python 自動化與 CLI 開發中,取得與監控系統資訊的常用方法。透過實作範例,你可以:
- 快速取得工作目錄、環境變數,並在跨平台腳本中安全地操作檔案路徑。
- 辨識作業系統與硬體平台,讓腳本能依環境自動調整行為。
- 即時監控 CPU、記憶體、磁碟與網路,為資源管理或監控儀表板提供可靠數據。
在實務中,別忘了 避免硬編碼、妥善處理權限與例外、使用 subprocess 取代 os.system,以及 將系統資訊抽象化,讓程式碼更具可讀性與可維護性。希望你能將本文的概念與範例直接套用到自己的自動化腳本或 CLI 工具中,提升開發效率與程式品質。祝你玩得開心,寫出更穩定、更智慧的 Python 自動化程式!