Python 的 sys
模块是一个与 Python 解释器交互的核心标准库,提供了对解释器参数、运行环境、系统资源的访问和控制。以下是 sys
模块的核心内容及常用函数详解:
一、sys 模块的核心功能
类别 | 功能描述 |
---|---|
命令行参数 | 获取脚本启动时的命令行参数(sys.argv )。 |
程序退出 | 控制脚本退出状态(sys.exit() )。 |
模块与路径管理 | 管理模块导入路径(sys.path )和已加载模块(sys.modules )。 |
系统信息 | 获取 Python 版本、操作系统平台等信息(sys.version , sys.platform )。 |
输入/输出流 | 重定向标准输入/输出/错误流(sys.stdin , sys.stdout , sys.stderr )。 |
内存与性能 | 查看对象内存占用(sys.getsizeof() )和递归深度(sys.getrecursionlimit() )。 |
二、常用函数与变量详解
1. 命令行参数处理
- **
sys.argv
**- 功能:获取命令行参数列表(列表类型,索引 0 为脚本名称)。
- 示例:
python
# 脚本内容(test.py) import sys print("脚本名称:", sys.argv[0]) print("参数列表:", sys.argv[1:])
bash
# 命令行运行 $ python test.py arg1 arg2 # 输出: # 脚本名称: test.py # 参数列表: ['arg1', 'arg2']
2. 程序退出控制
- **
sys.exit([status])
**- 功能:退出当前程序,可返回状态码(默认 0 表示正常退出,非 0 表示异常)。
- 示例:
python
import sys if len(sys.argv) < 2: print("缺少参数!") sys.exit(1) # 状态码 1 表示错误退出
3. 模块与路径管理
-
**
sys.path
**- 功能:Python 模块搜索路径列表(可动态修改)。
- 示例:添加自定义模块路径:
python
import sys sys.path.append("/my/custom/module/path") # 添加路径
-
**
sys.modules
**- 功能:字典类型,存储当前已导入的所有模块。
- 示例:检查模块是否已导入:
python
import sys if "numpy" in sys.modules: print("numpy 已导入")
4. 系统信息获取
-
**
sys.version
**- 功能:返回 Python 解释器版本信息(字符串)。
- 示例:
python
import sys print(sys.version) # 输出:3.9.7 (default, Aug 31 2021, ...)
-
**
sys.platform
**- 功能:返回操作系统平台标识符(如
win32
,linux
,darwin
对应 macOS)。 - 示例:跨平台代码适配:
python
import sys if sys.platform.startswith("win"): print("当前系统是 Windows")
- 功能:返回操作系统平台标识符(如
5. 输入/输出流重定向
- **
sys.stdin
/sys.stdout
/sys.stderr
**- 功能:文件对象,分别对应标准输入、输出和错误流。
- 示例:重定向输出到文件:
python
import sys with open("output.log", "w") as f: sys.stdout = f # 重定向标准输出到文件 print("这条信息会写入 output.log") sys.stdout = sys.__stdout__ # 恢复默认输出
6. 内存与递归管理
-
**
sys.getsizeof(object)
**- 功能:返回对象占用的内存大小(字节)。
- 示例:
python
import sys data = [i for i in range(1000)] print(sys.getsizeof(data)) # 输出列表占用的内存(如 9016 字节)
-
**
sys.getrecursionlimit()
/sys.setrecursionlimit(n)
**- 功能:获取/设置 Python 递归调用最大深度(默认 1000)。
- 示例:
python
import sys print(sys.getrecursionlimit()) # 输出:1000 sys.setrecursionlimit(2000) # 修改递归深度限制(需谨慎)
7. 异常处理
- **
sys.exc_info()
**- 功能:返回当前异常信息的元组(类型、值、追踪对象),需在
except
块内调用。 - 示例:
python
import sys try: 1 / 0 except: exc_type, exc_value, traceback = sys.exc_info() print("异常类型:", exc_type) # <class 'ZeroDivisionError'> print("异常信息:", exc_value) # division by zero
- 功能:返回当前异常信息的元组(类型、值、追踪对象),需在
三、其他实用函数
函数/变量 | 功能 |
---|---|
sys.getdefaultencoding() | 返回默认字符串编码(如 utf-8 )。 |
sys.byteorder | 返回系统字节顺序(big 或 little )。 |
sys.api_version | 返回 C API 版本号(用于扩展开发)。 |
四、示例代码合集
1. 读取命令行参数并处理
import sys
if len(sys.argv) != 3:
print(f"用法:{sys.argv[0]} <输入文件> <输出文件>")
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
print(f"处理文件:{input_file} -> {output_file}")
2. 动态添加模块搜索路径
import sys
sys.path.insert(0, "/my/custom/path") # 优先搜索自定义路径
import my_module # 导入自定义模块
3. 捕获并打印异常信息
import sys
try:
with open("nonexistent.txt") as f:
content = f.read()
except FileNotFoundError:
exc_type, exc_value, _ = sys.exc_info()
print(f"错误类型:{exc_type.__name__}, 错误信息:{exc_value}")
五、注意事项
- 谨慎修改递归深度:过高的递归深度可能导致栈溢出崩溃。
- 避免滥用
sys.exit()
:在大型项目中应优先抛出异常而非直接退出。 - 跨平台兼容性:使用
sys.platform
检查操作系统时需注意不同平台的标识符(如 macOS 为darwin
)。
sys
模块是 Python 系统级编程的基石,合理使用可提升脚本的灵活性和健壮性。建议结合官方文档(Python sys Module)深入学习。