sys
是 Python 標準庫中的一個內置模塊,它提供了許多與 Python 解釋器和系統環境進行交互的功能。
sys方法
1. 導入 sys
模塊
在使用 sys
庫的功能之前,需要先導入它:
import sys
2. 命令行參數 (sys.argv
)
sys.argv
是一個包含命令行參數的列表。其中,sys.argv[0]
是腳本的名稱,后續的元素是傳遞給腳本的參數。
import sys# 打印腳本名稱
print(f"腳本名稱: {sys.argv[0]}")# 打印所有命令行參數
for i, arg in enumerate(sys.argv):print(f"參數 {i}: {arg}")
假設將上述代碼保存為 test.py
,在命令行中運行 python test.py arg1 arg2
,輸出結果將顯示腳本名稱和傳遞的參數。
3. Python 解釋器信息
3.1 sys.version
sys.version
是一個字符串,包含了 Python 解釋器的版本信息,如 Python 版本號、編譯信息等。
import sys
print(sys.version)
3.2 sys.version_info
sys.version_info
是一個 namedtuple
,包含了 Python 版本的主要信息,如主版本號、次版本號、微版本號等。
import sys
print(sys.version_info)
print(f"主版本號: {sys.version_info.major}")
print(f"次版本號: {sys.version_info.minor}")
4. 系統路徑 (sys.path
)
sys.path
是一個包含模塊搜索路徑的列表。Python 在導入模塊時,會按照這個列表中的路徑順序進行搜索。
import sys# 打印系統路徑
for path in sys.path:print(path)# 可以動態添加路徑
sys.path.append('/path/to/your/module')
5. 退出 Python 解釋器 (sys.exit()
)
sys.exit()
函數用于退出 Python 解釋器。可以傳遞一個整數參數作為退出狀態碼,默認狀態碼為 0 表示正常退出。
import systry:# 一些代碼邏輯result = 1 / 0 # 模擬異常
except ZeroDivisionError:print("發生除零錯誤,程序退出")sys.exit(1) # 以狀態碼 1 退出
6. 標準輸入、輸出和錯誤流
sys
模塊提供了對標準輸入 (sys.stdin
)、標準輸出 (sys.stdout
) 和標準錯誤 (sys.stderr
) 的訪問。
6.1 標準輸出重定向
import sys# 保存原始的標準輸出
original_stdout = sys.stdout# 打開一個文件以寫入模式
with open('output.txt', 'w') as f:# 將標準輸出重定向到文件sys.stdout = fprint("這行文本將被寫入文件")# 恢復標準輸出
sys.stdout = original_stdout
print("這行文本將顯示在控制臺")
6.2 標準輸入讀取
import sys# 從標準輸入讀取一行
line = sys.stdin.readline()
print(f"你輸入的內容是: {line.strip()}")
7. 遞歸深度限制 (sys.getrecursionlimit()
和 sys.setrecursionlimit()
)
Python 解釋器對遞歸調用的深度有一個默認限制,以防止無限遞歸導致棧溢出。可以使用 sys.getrecursionlimit()
獲取當前的遞歸深度限制,使用 sys.setrecursionlimit()
設置新的遞歸深度限制。
import sys# 獲取當前遞歸深度限制
current_limit = sys.getrecursionlimit()
print(f"當前遞歸深度限制: {current_limit}")# 設置新的遞歸深度限制
sys.setrecursionlimit(2000)
new_limit = sys.getrecursionlimit()
print(f"新的遞歸深度限制: {new_limit}")
8. 平臺信息 (sys.platform
)
sys.platform
是一個字符串,用于標識當前 Python 解釋器運行的操作系統平臺。
import sysprint(f"當前操作系統平臺: {sys.platform}")
常見的平臺標識符包括 'win32'
(Windows)、'linux'
(Linux)、'darwin'
(macOS)等。
9. 最大整數值 (sys.maxsize
)
sys.maxsize
表示當前平臺上 Python 解釋器所能表示的最大整數值。
import sysprint(f"最大整數值: {sys.maxsize}")
10. 內置模塊信息 (sys.builtin_module_names
)
sys.builtin_module_names
是一個包含所有內置模塊名稱的元組。
import sysprint("所有內置模塊名稱:")
for module_name in sys.builtin_module_names:print(module_name)
11. 內存使用信息 (sys.getsizeof()
)
sys.getsizeof()
函數用于返回對象占用的內存大小(以字節為單位)。
import sysmy_list = [1, 2, 3, 4, 5]
list_size = sys.getsizeof(my_list)
print(f"列表占用的內存大小: {list_size} 字節")
os模塊常量
一、平臺標識常量
1. os.name
值 | 對應系統 | 典型場景 |
---|---|---|
posix | Linux/macOS | 判斷是否支持 Unix 特性 |
nt | Windows | 處理路徑分隔符差異 |
java | Jython 環境 | 特殊運行環境檢測 |
if os.name == 'posix':print("正在類 Unix 系統運行")
二、路徑操作常量
1. 路徑分隔符
常量 | 值 (Win/Linux) | 作用 |
---|---|---|
os.sep | \ / / | 路徑層級分隔符(推薦替代硬編碼符號) |
os.altsep | / / None | 備用分隔符(Win 兼容 Unix 路徑) |
os.extsep | . | 文件名與擴展名的分隔符 |
跨平臺路徑構建示例:
config_path = ["data", "config", "app.yaml"]
full_path = os.sep.join(config_path) # 自動適配系統分隔符
2. 路徑組合符
常量 | 值 (Win/Linux) | 應用場景 |
---|---|---|
os.pathsep | ; / : | 環境變量多路徑分隔符(PATH) |
os.defpath | .;/bin / 類似值 | 可執行文件默認搜索路徑 |
三、目錄符號常量
常量 | 值 | 功能說明 |
---|---|---|
os.curdir | . | 表示當前目錄 |
os.pardir | .. | 表示父目錄 |
路徑解析示例:
parent_dir = os.path.abspath(os.path.join(os.curdir, os.pardir))
四、文件操作常量
1. 文件存在性及權限檢查
常量 | 二進制掩碼 | 用途 |
---|---|---|
os.F_OK | 0 | 檢查文件是否存在 |
os.R_OK | 4 | 檢查讀權限 |
os.W_OK | 2 | 檢查寫權限 |
os.X_OK | 1 | 檢查執行權限 |
權限驗證代碼:
if os.access("/usr/bin/python", os.X_OK):print("文件可執行")
2. 文件打開模式(需配合 os.open
)
常量 | 功能說明 |
---|---|
os.O_RDONLY | 只讀模式 |
os.O_WRONLY | 只寫模式 |
os.O_RDWR | 讀寫模式 |
os.O_CREAT | 文件不存在時創建 |
os.O_EXCL | 與 O_CREAT 配合使用防覆蓋 |
文件創建示例:
fd = os.open("data.log", os.O_WRONLY | os.O_CREAT, 0o644)
3. 文件指針定位
常量 | 對應值 | 描述 |
---|---|---|
os.SEEK_SET | 0 | 文件起始位置 |
os.SEEK_CUR | 1 | 當前指針位置 |
os.SEEK_END | 2 | 文件末尾位置 |
五、特殊設備常量
常量 | 路徑 (Win/Linux) | 用途 |
---|---|---|
os.devnull | nul / /dev/null | 空設備(丟棄輸出) |
使用示例:
with open(os.devnull, 'w') as f:sys.stdout = f # 禁用標準輸出
六、其他實用常量
常量 | 說明 |
---|---|
os.linesep | 系統換行符(\n /\r\n ) |
os.supports_follow_symlinks | 函數是否支持符號鏈接追蹤 |
綜合應用場景
跨平臺路徑處理模板
import osdef safe_join(base, *paths):"""跨平臺安全路徑拼接"""full_path = os.path.abspath(os.path.join(base, *paths))if not os.path.exists(full_path):os.makedirs(full_path, exist_ok=True)return full_path.replace(os.sep, '/') # 統一為 Unix 風格路徑
權限檢查工具函數
def validate_permissions(filepath):"""詳細權限檢查"""checks = [(os.F_OK, "存在性"),(os.R_OK, "可讀性"),(os.W_OK, "可寫性"),(os.X_OK, "可執行性")]for flag, desc in checks:print(f"{desc}: {'√' if os.access(filepath, flag) else '×'}")
注意事項
-
平臺差異性
Windows 和 Linux 的常量表現不同,建議通過os.path
模塊函數代替直接操作常量 -
常量只讀性
所有os
模塊常量均為只讀,修改會觸發AttributeError
-
版本兼容
Python 3.10+ 新增os.O_TMPFILE
(Linux 專屬)等常量,需注意版本差異