人工智能之編程進階 Python高級

第三章 系統類模塊


(文章目錄)


前言

本章節之後會講述一些創建的標準庫使用方式,本文主要介紹兩種模塊os以及sys模塊


os模塊

os 模塊是 Python 標準庫中用於與操作系統交互的核心模塊,提供了訪問文件系統、環境變量、進程管理、路徑操作等功能。它是編寫跨平台(Windows、macOS、Linux)腳本的重要工具。


一、導入方式

import os

⚠️ 注意:os 模塊本身不處理路徑拼接的跨平台問題(如 / vs \),推薦配合 os.path 或更現代的 pathlib 使用。


二、常用功能分類

1. 路徑操作(os.path 子模塊)

雖然 os.path 是獨立子模塊,但通常與 os 一起使用。

import os

# 獲取當前工作目錄
cwd = os.getcwd()
print("當前目錄:", cwd)

# 改變工作目錄
os.chdir("/tmp")

# 路徑拼接(自動處理斜槓)
path = os.path.join("folder", "subfolder", "file.txt")
print(path)  # folder/subfolder/file.txt (Linux/macOS) 或 folder\subfolder\file.txt (Windows)

# 路徑解析
full_path = "/home/user/docs/report.pdf"
print(os.path.basename(full_path))   # "report.pdf"
print(os.path.dirname(full_path))    # "/home/user/docs"
print(os.path.split(full_path))      # ("/home/user/docs", "report.pdf")

# 檢查路徑是否存在
if os.path.exists("/etc/passwd"):
    print("文件存在")

# 檢查類型
print(os.path.isfile("test.txt"))    # 是否是文件
print(os.path.isdir("my_folder"))    # 是否是目錄
print(os.path.islink("symlink"))     # 是否是符號鏈接

# 獲取絕對路徑
abs_path = os.path.abspath("relative/path")
print(abs_path)

# 規範化路徑(處理 . 和 ..)
norm = os.path.normpath("/a/b/../c/./d")
print(norm)  # /a/c/d

✅ ​替代方案​:Python 3.4+ 推薦使用 pathlib.Path(更面向對象、更簡潔):

from pathlib import Path
p = Path("folder") / "subfolder" / "file.txt"

2. 文件和目錄操作

創建與刪除
# 創建單層目錄
os.mkdir("new_folder")

# 創建多層目錄(類似 mkdir -p)
os.makedirs("parent/child/grandchild", exist_ok=True)

# 刪除文件
os.remove("old_file.txt")

# 刪除空目錄
os.rmdir("empty_folder")

# 刪除非空目錄(需用 shutil)
import shutil
shutil.rmtree("non_empty_folder")
列出目錄內容
# 列出目錄下所有文件和子目錄名
files = os.listdir("/home/user")
print(files)

# 遍歷目錄樹(生成器,節省內存)
for root, dirs, files in os.walk("/home/user"):
    print(f"當前目錄: {root}")
    print(f"子目錄: {dirs}")
    print(f"文件: {files}")
    print("-" * 30)
文件信息(元數據)
stat_info = os.stat("example.txt")
print(f"大小: {stat_info.st_size} 字節")
print(f"修改時間: {stat_info.st_mtime}")  # 時間戳

# 更友好的時間格式
import time
mtime = time.ctime(stat_info.st_mtime)
print("修改時間:", mtime)

3. 環境變量

# 獲取環境變量
home = os.environ.get("HOME")  # 安全獲取(不存在返回 None)
user = os.getenv("USER", "default_user")  # 可設默認值

# 設置環境變量(僅當前進程有效)
os.environ["MY_VAR"] = "my_value"

# 刪除環境變量
if "MY_VAR" in os.environ:
    del os.environ["MY_VAR"]

4. 進程與系統信息

# 獲取進程 ID
pid = os.getpid()
print("當前進程ID:", pid)

# 獲取父進程 ID
ppid = os.getppid()
print("父進程ID:", ppid)

# 執行系統命令(不推薦,有安全風險)
os.system("ls -l")  # 返回退出狀態碼

# 獲取系統名稱
print(os.name)  # 'posix' (Linux/macOS), 'nt' (Windows)

# 獲取登錄用户名
try:
    print(os.getlogin())
except OSError:
    import getpass
    print(getpass.getuser())  # 更可靠

🔒 ​安全提示​:避免使用 os.system() 執行用户輸入的命令,推薦用 subprocess 模塊。


5. 權限與所有權(Unix/Linux/macOS)

# 修改文件權限(八進制)
os.chmod("script.sh", 0o755)  # rwxr-xr-x

# 修改文件所有者(需 root 權限)
# os.chown("file.txt", uid, gid)

三、跨平台注意事項

功能 Windows Unix-like (Linux/macOS)
路徑分隔符 \ /
行結束符 \r\n \n
環境變量 os.environ['USERNAME'] os.environ['USER']
可執行文件擴展名 .exe

✅ ​解決方案​:

  • 使用 os.path.join() 拼接路徑
  • 使用 os.linesep 獲取當前系統換行符
  • 使用 os.sep 獲取路徑分隔符(但通常不需要)
# 跨平台路徑示例
config_path = os.path.join(os.path.expanduser("~"), ".myapp", "config.ini")

四、常用實用函數

# 展開 ~ 為用户主目錄
home_config = os.path.expanduser("~/.bashrc")

# 獲取臨時目錄
tmp_dir = os.environ.get("TMPDIR", "/tmp")  # Unix
# 或使用 tempfile 模塊更安全

# 生成隨機字節(用於臨時文件名等)
random_bytes = os.urandom(16)  # 16字節隨機數據

五、與 pathlib 對比(Python 3.4+)

操作 os.path pathlib
路徑拼接 os.path.join("a", "b") Path("a") / "b"
讀取文件 open(path).read() Path(path).read_text()
檢查存在 os.path.exists(p) Path(p).exists()
遍歷目錄 os.walk() Path(p).rglob("*.py")

✅ ​建議​:新項目優先使用 pathlib,舊代碼或簡單腳本可用 os.path


六、典型應用場景

1. 批量重命名文件

import os

folder = "photos"
for i, filename in enumerate(os.listdir(folder)):
    if filename.endswith(".jpg"):
        old_path = os.path.join(folder, filename)
        new_path = os.path.join(folder, f"photo_{i:03d}.jpg")
        os.rename(old_path, new_path)

2. 查找大文件

def find_large_files(directory, min_size_mb=100):
    min_size = min_size_mb * 1024 * 1024
    for root, _, files in os.walk(directory):
        for file in files:
            path = os.path.join(root, file)
            try:
                if os.path.getsize(path) > min_size:
                    print(f"{path} ({os.path.getsize(path) / 1024 / 1024:.1f} MB)")
            except OSError:
                pass  # 跳過無法訪問的文件

find_large_files("/home/user", 50)

3. 創建項目目錄結構

def create_project_structure(project_name):
    dirs = [
        f"{project_name}/src",
        f"{project_name}/tests",
        f"{project_name}/docs"
    ]
    for d in dirs:
        os.makedirs(d, exist_ok=True)
    
    # 創建初始化文件
    with open(f"{project_name}/src/__init__.py", "w") as f:
        pass

create_project_structure("my_project")

七、注意事項與最佳實踐

✅ 推薦做法

  1. 使用 os.path.join() 拼接路徑​,避免硬編碼 /\
  2. 檢查文件是否存在再操作(但注意競態條件)
  3. 使用 exist_ok=True 避免 FileExistsError
  4. ​**優先使用 pathlib**​(Python 3.4+)
  5. 不要用 os.system() 執行外部命令​,改用 subprocess

❌ 避免的做法

# 錯誤:硬編碼路徑分隔符
path = "folder\\subfolder\\file.txt"  # Windows only

# 正確
path = os.path.join("folder", "subfolder", "file.txt")

# 錯誤:直接拼接字符串
path = user_input + "/config.txt"  # 可能導致路徑遍歷錯誤

# 正確:使用 os.path.join 並驗證路徑
base = "/safe/base/dir"
path = os.path.join(base, user_input)
if not path.startswith(base):
    raise ValueError("Invalid path")

八、總結

功能類別 常用函數/屬性
路徑操作 os.path.join,os.path.exists,os.path.isfile
目錄操作 os.listdir,os.walk,os.makedirs
文件操作 os.remove,os.rename,os.stat
環境變量 os.environ,os.getenv
進程信息 os.getpid,os.getppid
系統信息 os.name,os.uname()(Unix)

🔑 ​核心思想​: os 模塊讓你用統一的 Python 接口操作不同操作系統的底層功能,實現​跨平台兼容性​。

sys模塊

sys 模塊是 Python 標準庫中用於與 Python 解釋器及其運行環境交互的核心模塊。它提供了訪問命令行參數、退出程序、獲取 Python 版本、操作模塊搜索路徑等功能,常用於腳本控制、調試和系統級編程。


一、導入方式

import sys

二、常用功能詳解

1. 命令行參數(sys.argv

獲取傳遞給 Python 腳本的命令行參數。

# script.py
import sys

print("腳本名:", sys.argv[0])
print("參數個數:", len(sys.argv) - 1)
print("所有參數:", sys.argv[1:])

# 運行:python script.py hello 123 --verbose
# 輸出:
# 腳本名: script.py
# 參數個數: 3
# 所有參數: ['hello', '123', '--verbose']

✅ ​用途​:編寫 CLI 工具、批處理腳本。


2. 退出程序(sys.exit()

優雅地終止程序,可指定退出狀態碼。

import sys

if not user_authenticated:
    print("認證失敗!", file=sys.stderr)
    sys.exit(1)  # 非0表示錯誤

print("程序正常運行...")
sys.exit(0)  # 0 表示成功(可省略)
  • sys.exit() 本質是拋出 SystemExit 異常,可被捕獲(但通常不建議)。
  • 狀態碼:
    • 0:成功
    • 0:錯誤(如 1, 2 等)

3. 標準輸入/輸出/錯誤流(sys.stdin, sys.stdout, sys.stderr

重定向或操作標準流。

import sys

# 讀取所有標準輸入(類似 cat)
# data = sys.stdin.read()

# 寫入標準輸出
sys.stdout.write("Hello, stdout!\n")

# 寫入標準錯誤(用於錯誤信息)
sys.stderr.write("Error: something went wrong!\n")

# 重定向輸出到文件
with open("output.log", "w") as f:
    sys.stdout = f
    print("這條信息會寫入文件")
    sys.stdout = sys.__stdout__  # 恢復原始 stdout

💡 print() 默認輸出到 sys.stdout,錯誤信息應輸出到 sys.stderr


4. Python 解釋器信息

import sys

print("Python 版本:", sys.version)        # 詳細版本字符串
print("Python 版本信息:", sys.version_info)  # 命名元組 (major=3, minor=10, ...)
print("平台:", sys.platform)              # 'linux', 'win32', 'darwin' (macOS)
print("可執行文件路徑:", sys.executable)   # Python 解釋器路徑
print("模塊搜索路徑:", sys.path)          # 列表,解釋器查找模塊的位置

✅ ​用途​:條件兼容不同平台或版本。

if sys.version_info < (3, 8):
    raise RuntimeError("需要 Python 3.8+")

5. 模塊與導入系統

sys.modules

已加載的模塊字典(緩存),可用於檢查或強制重載。

import json
print('json' in sys.modules)  # True

# 強制重載模塊(調試時用)
import importlib
importlib.reload(json)
sys.path

Python 查找模塊的路徑列表,可動態修改。

# 添加自定義模塊路徑
sys.path.insert(0, "/my/custom/modules")

# 現在可以導入該路徑下的模塊
import my_module

⚠️ 修改 sys.path 會影響整個解釋器會話。


6. 遞歸限制(sys.getrecursionlimit(), sys.setrecursionlimit()

防止無限遞歸導致棧溢出。

import sys

print("默認遞歸限制:", sys.getrecursionlimit())  # 通常 1000

# 增加限制(謹慎使用!)
sys.setrecursionlimit(2000)

def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)

print(factorial(500))  # 可能需要更高遞歸限制

❗ 過高的遞歸限制可能導致程序崩潰。


7. 強制刷新輸出緩衝(sys.stdout.flush()

確保輸出立即顯示(尤其在循環或長時間運行任務中)。

import sys
import time

for i in range(5):
    sys.stdout.write(f"\r進度: {i+1}/5")
    sys.stdout.flush()  # 立即輸出
    time.sleep(1)
print("\n完成!")

💡 在 Jupyter 或 IDE 中可能自動刷新,但在終端腳本中常需手動刷新。


8. 獲取對象引用計數(sys.getrefcount()

用於調試內存管理(CPython 特有)。

import sys

a = []
print(sys.getrefcount(a))  # 至少為 2(a 和 getrefcount 的參數)

🔍 一般開發者很少使用,主要用於底層調試。


三、典型應用場景

1. 編寫命令行工具

import sys

def main():
    if len(sys.argv) != 2:
        print("用法: python tool.py <filename>", file=sys.stderr)
        sys.exit(1)
    
    filename = sys.argv[1]
    try:
        with open(filename) as f:
            print(f.read())
    except FileNotFoundError:
        print(f"錯誤: 文件 {filename} 不存在", file=sys.stderr)
        sys.exit(2)

if __name__ == "__main__":
    main()

2. 捕獲未處理異常(用於日誌記錄)

import sys
import traceback

def handle_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return
    print("程序崩潰!詳細信息已記錄到 error.log", file=sys.stderr)
    with open("error.log", "w") as f:
        traceback.print_exception(exc_type, exc_value, exc_traceback, file=f)

sys.excepthook = handle_exception

3. 動態調整輸出編碼(解決中文亂碼)

import sys
import io

# 強制 stdout 使用 UTF-8(Windows 常見問題)
if sys.stdout.encoding != 'utf-8':
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

四、sys vs os 模塊對比

功能 sys 模塊 os 模塊
作用對象 Python 解釋器本身 操作系統
命令行參數 sys.argv
退出程序 sys.exit() ❌(但 os._exit() 可強制退出)
環境變量 os.environ
文件/目錄操作 os.remove,os.listdir
標準流 sys.stdin/stdout/stderr
Python 版本 sys.version

💡 兩者常配合使用:

import sys, os
if sys.platform == "win32":
    os.system("cls")
else:
    os.system("clear")

五、注意事項與最佳實踐

✅ 推薦做法

  1. ​**用 sys.exit() 代替 exit()**​(後者是內置函數,僅適用於交互式環境)
  2. 錯誤信息輸出到 sys.stderr
  3. 檢查 sys.argv 長度避免 IndexError
  4. sys.version_info 做版本判斷(而非字符串比較)

❌ 避免的做法

# 不推薦:使用內置 exit()
exit(1)

# 推薦
sys.exit(1)

# 不安全:直接修改 sys.modules
sys.modules['json'] = None  # 可能導致程序崩潰

# 不可靠:依賴 sys.path 順序
# 應使用虛擬環境或明確安裝路徑

六、總結:sys 模塊核心屬性/函數速查

功能 用法
命令行參數 sys.argv
退出程序 sys.exit([code])
標準輸入 sys.stdin
標準輸出 sys.stdout
標準錯誤 sys.stderr
Python 版本 sys.version,sys.version_info
操作系統平台 sys.platform
模塊搜索路徑 sys.path
已加載模塊 sys.modules
遞歸限制 sys.getrecursionlimit(),sys.setrecursionlimit()
刷新輸出 sys.stdout.flush()

總結

本文主要介紹兩種常見的模塊的實際應用,方便在不同情況下的操作,歡迎一起來學習,當前我們處於python語言的應用級別,並未涉及到算法庫,先掌握基本的語言應用,再繼續學習後續人工智能的相關領域的實踐。

資料關注

相關資料獲取: 公眾號:咚咚王

藝術二維碼.png

《Python編程:從入門到實踐》 《利用Python進行數據分析》 《算法導論中文第三版》 《概率論與數理統計(第四版) (盛驟) 》 《程序員的數學》 《線性代數應該這樣學第3版》 《微積分和數學分析引論》 《(西瓜書)周志華-機器學習》 《TensorFlow機器學習實戰指南》 《Sklearn與TensorFlow機器學習實用指南》 《模式識別(第四版)》 《深度學習 deep learning》伊恩·古德費洛著 花書 《Python深度學習第二版(中文版)【純文本】 (登封大數據 (Francois Choliet)) (Z-Library)》 《深入淺出神經網絡與深度學習+(邁克爾·尼爾森(Michael+Nielsen) 》 《自然語言處理綜論 第2版》 《Natural-Language-Processing-with-PyTorch》 《計算機視覺-算法與應用(中文版)》 《Learning OpenCV 4》 《AIGC:智能創作時代》杜雨+&+張孜銘 《AIGC原理與實踐:零基礎學大語言模型、擴散模型和多模態模型》 《從零構建大語言模型(中文版)》 《實戰AI大模型》 《AI 3.0》