本文 AI 產出,尚未審核

Python 自動化與腳本應用:系統資訊(os、platform、psutil)


簡介

在日常的自動化腳本或 CLI 工具開發中,取得系統資訊是最常見的需求之一。無論是要根據作業系統選擇不同的指令、檢查磁碟空間、監控 CPU 使用率,或是偵測執行環境的 Python 版本,正確且快速地取得這些資訊,都能讓程式更具彈性與可靠性。

Python 內建的 osplatform 模組提供了跨平台的基礎資訊查詢,而功能更完整、更易於擴充的第三方套件 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 個實用範例,涵蓋 osplatformpsutil 的核心功能。每段程式碼皆附有說明註解,方便直接貼上使用。

範例 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 能讓輸出更易讀,非必要時可直接 print


常見陷阱與最佳實踐

陷阱 說明 解決方案
硬編碼路徑分隔符 直接使用 \/ 會在跨平台時出錯。 使用 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)

最佳實踐

  1. 抽象化系統資訊:將 osplatformpsutil 的呼叫封裝在獨立的函式或類別,讓主程式只關心「我要什麼資訊」而非「怎麼取得」。
  2. 使用 pathlib:相較於 os.pathpathlib.Path 提供面向物件的路徑操作,更直觀且支援型別提示。
  3. 加入日誌:在自動化腳本中,使用 logging 記錄取得的系統資訊與錯誤,有助於除錯與審計。
  4. 測試跨平台:在 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() 列舉所有進程,過濾出可疑名稱並記錄。

總結

本篇文章從 基礎的 osplatform功能強大的 psutil,系統性說明了在 Python 自動化與 CLI 開發中,取得與監控系統資訊的常用方法。透過實作範例,你可以:

  • 快速取得工作目錄、環境變數,並在跨平台腳本中安全地操作檔案路徑。
  • 辨識作業系統與硬體平台,讓腳本能依環境自動調整行為。
  • 即時監控 CPU、記憶體、磁碟與網路,為資源管理或監控儀表板提供可靠數據。

在實務中,別忘了 避免硬編碼、妥善處理權限與例外、使用 subprocess 取代 os.system,以及 將系統資訊抽象化,讓程式碼更具可讀性與可維護性。希望你能將本文的概念與範例直接套用到自己的自動化腳本或 CLI 工具中,提升開發效率與程式品質。祝你玩得開心,寫出更穩定、更智慧的 Python 自動化程式!