sys 模組提供對 Python 解譯器執行時環境的直接存取。從命令列參數、模組搜尋路徑、標準串流控制到程式結束機制,是撰寫系統級腳本與工具的必備利器。本文系統梳理六大核心應用場景。
sys.argvsys.argv 是字串列表,argv[0] 為腳本名稱,其餘為參數。
import sys
print(f"腳本名稱: {sys.argv[0]}")
if len(sys.argv) > 1:
print(f"參數數量: {len(sys.argv)-1}")
for i, arg in enumerate(sys.argv[1:], 1):
print(f" 參數{i}: {arg}")
else:
print("無參數")
# 特殊情況:
# python < script.py -> argv[0] == ''
# python -c "code" -> argv[0] == '-c'
sys.pathsys.path 是目錄字串列表,Python 依序搜尋匯入模組。啟動時由 PYTHONPATH、註冊表、預設路徑初始化。可在執行期動態修改:
import sys
print(f"路徑數量: {len(sys.path)}")
sys.path.insert(0, './my_modules') # 優先搜尋專案本地模組
import my_custom_module
# 極端範例:清空路徑後仍可匯入內建模組
sys.path = []
import random # 內建模組不受影響
# 判斷模組是否為內建
def dump(module_name):
print(f"{module_name} => ", end='')
if module_name in sys.builtin_module_names:
print("<內建>")
else:
m = __import__(module_name)
print(m.__file__)
for mod in ['os', 'sys', 'json', 'collections', 'numpy']:
dump(mod)
# 列出所有已載入模組
print(list(sys.modules.keys()))
sys.platform
import sys
print(sys.platform) # 'win32', 'linux', 'darwin', 'cygwin' 等
sys.stdout、sys.stderr、sys.stdin 為類檔案物件(僅支援 write/readline 等)。
import sys
# 一般 print 等同於:
sys.stdout.write('Hello\n')
# 重導向 stdout 到檔案
save_out = sys.stdout
with open('output.log', 'w') as f:
sys.stdout = f
print('這行寫入檔案,不顯示螢幕')
sys.stdout = save_out # 恢復
# 重導向 stderr 捕獲錯誤
with open('error.log', 'w') as f:
sys.stderr = f
raise RuntimeError('錯誤被導向檔案')
# 快速寫入 stderr(不影響後續 print)
print('警告訊息', file=sys.stderr)
sys.exit() 與 sys.exitfuncsys.exit(n) 拋出 SystemExit 例外(非立即結束),可被 try/except 捕獲:
import sys
print("開始")
try:
sys.exit(1)
except SystemExit:
print("捕獲退出,繼續執行")
print("結束")
# 註冊結束處理函數(Python 3 建議用 atexit 模組)
def cleanup():
print("清理資源...")
sys.exitfunc = cleanup # 僅 Python 2 風格,Python 3 請用 atexit.register(cleanup)
print("設定完成")
sys.exit(0)
sys 模組是通往 Python 執行核心的橋樑。掌握 argv、path、串流重導向與 exit 機制,能讓你撰寫出更專業的命令列工具、測試腳本與系統整合程式。