Skip to content

02 sys模块

你写的Python代码跑在Python解释器里,sys模块就是你和解释器"对话"的窗口——获取解释器版本、读取命令行参数、修改模块搜索路径、控制程序退出……这些都得靠sys

builtins一样,sys也是自动可用的,不需要import。但按照惯例,还是建议在文件开头写上import sys,让代码更清晰。

一、系统信息

1.1 版本相关

python
import sys

# Python版本字符串
sys.version
# '3.14.0 (main, Jun 13 2026, 10:00:00) [GCC 11.4.0]'

# 版本信息元组
sys.version_info
# sys.version_info(major=3, minor=14, micro=0, releaselevel='final', serial=0)

# 常用:检查Python版本
if sys.version_info >= (3, 11):
    print("支持3.11+特性")

# 解释器路径
sys.executable
# '/usr/bin/python3'

1.2 平台信息

python
# 操作系统平台
sys.platform
# 'linux' / 'darwin' / 'win32'

# 根据平台执行不同代码
if sys.platform == "win32":
    print("Windows系统")
elif sys.platform == "darwin":
    print("macOS系统")
elif sys.platform == "linux":
    print("Linux系统")

# 路径分隔符
sys.prefix      # 安装前缀
sys.exec_prefix # 可执行文件前缀

1.3 内存与限制

python
# 对象占用的内存大小(字节)
sys.getsizeof(0)         # 28
sys.getsizeof("")        # 49
sys.getsizeof([])        # 56
sys.getsizeof({})        # 64

# 最大整数值
sys.maxsize              # 9223372036854775807

# 浮点数信息
sys.float_info
# sys.float_info(max=1.7976931348623157e+308, max_exp=1024, ...)

二、命令行参数

2.1 sys.argv

sys.argv是一个列表,包含了命令行参数。argv[0]是脚本名,后面依次是传入的参数。

python
# app.py
import sys

print(f"脚本名: {sys.argv[0]}")
print(f"参数列表: {sys.argv[1:]}")
print(f"参数个数: {len(sys.argv) - 1}")

运行:

bash
python app.py hello world 123

输出:

脚本名: app.py
参数列表: ['hello', 'world', '123']
参数个数: 3

2.2 解析命令行参数

python
# agent_cli.py
import sys

def main():
    if len(sys.argv) < 2:
        print("用法: python agent_cli.py <query>")
        sys.exit(1)

    query = sys.argv[1]

    if "--verbose" in sys.argv:
        print(f"调试模式: query={query}")

    print(f"Agent收到查询: {query}")

if __name__ == "__main__":
    main()

实际项目中,建议用argparse模块来处理命令行参数,它更强大也更规范。

三、模块搜索路径

3.1 sys.path

sys.path是一个列表,Python在import模块时会按顺序搜索这些路径。

python
import sys

for path in sys.path:
    print(path)
# /Users/apple/project
# /usr/lib/python3.14
# /usr/lib/python3.14/lib-dynload
# /usr/lib/python3.14/site-packages
# ...

3.2 动态添加模块路径

python
import sys

# 添加自定义模块路径
sys.path.append("/opt/my_modules")
sys.path.insert(0, "./libs")  # 插入到最前面,优先搜索

# 现在可以import这些路径下的模块
import my_custom_module

3.3 已加载模块

python
import sys

# 查看当前已加载的所有模块
print(sys.modules.keys())

# 检查某个模块是否已加载
if "numpy" in sys.modules:
    print("numpy已加载")

四、标准流

4.1 标准输入/输出/错误

python
import sys

# 标准输入(默认是键盘)
sys.stdin

# 标准输出(默认是终端)
sys.stdout

# 标准错误(默认是终端,但不会被重定向)
sys.stderr

4.2 重定向输出

python
import sys

# 临时重定向stdout到文件
with open("output.txt", "w") as f:
    old_stdout = sys.stdout
    sys.stdout = f
    print("这行内容会写入文件")
    sys.stdout = old_stdout

# 更优雅的方式:用contextlib.redirect_stdout
from contextlib import redirect_stdout

with open("output.txt", "w") as f:
    with redirect_stdout(f):
        print("这行内容会写入文件")

4.3 直接写入stderr

python
import sys

# print()默认写入stdout
print("普通输出")

# 错误信息应该写入stderr
print("错误信息", file=sys.stderr)

# 或者用stderr.write()
sys.stderr.write("错误信息\n")

五、程序控制

5.1 sys.exit()

退出Python程序。

python
import sys

def check_config():
    if not config_exists():
        print("配置文件不存在,程序退出")
        sys.exit(1)  # 非零状态码表示异常退出

# 状态码约定
# 0: 正常退出
# 1: 一般错误
# 2: 语法错误
# 其他: 自定义错误

sys.exit()实际上是抛出SystemExit异常,可以被捕获:

python
try:
    sys.exit(1)
except SystemExit as e:
    print(f"程序尝试退出,状态码: {e.code}")

5.2 sys.exc_info()

获取当前正在处理的异常信息。

python
import sys

try:
    1 / 0
except:
    exc_type, exc_value, exc_tb = sys.exc_info()
    print(f"异常类型: {exc_type}")    # <class 'ZeroDivisionError'>
    print(f"异常值: {exc_value}")     # division by zero
    print(f"追踪对象: {exc_tb}")      # <traceback object>

六、环境与编码

6.1 默认编码

python
import sys

# 默认编码(通常是utf-8)
sys.getdefaultencoding()      # 'utf-8'

# 文件系统编码
sys.getfilesystemencoding()   # 'utf-8' (Linux/macOS) / 'utf-8' (Windows)

6.2 递归限制

python
import sys

# 查看最大递归深度
sys.getrecursionlimit()  # 默认1000

# 修改递归限制(谨慎使用)
sys.setrecursionlimit(5000)

6.3 字节序

python
import sys

# 本机字节序
sys.byteorder  # 'little' (x86/x64) 或 'big' (某些嵌入式)

七、实用技巧

7.1 判断运行环境

python
import sys

# 判断是否在交互式环境
if hasattr(sys, 'ps1'):
    print("在交互式Python中运行")
else:
    print("在脚本中运行")

# 判断是否被冻结(py2exe、PyInstaller等)
if getattr(sys, 'frozen', False):
    print("打包后的程序")
else:
    print("正常Python环境")

7.2 获取调用栈信息

python
import sys

def func_a():
    func_b()

def func_b():
    # 获取当前调用栈
    frame = sys._getframe(0)  # 当前帧
    print(f"当前函数: {frame.f_code.co_name}")

    frame = sys._getframe(1)  # 调用者帧
    print(f"调用者: {frame.f_code.co_name}")

func_a()
# 当前函数: func_b
# 调用者: func_a

7.3 检查Python实现

python
import sys

# 当前Python实现信息
sys.implementation
# namespace(cache_tag='cpython-314', hexversion=51243760, name='cpython', ...)

if sys.implementation.name == "cpython":
    print("标准CPython")
elif sys.implementation.name == "pypy":
    print("PyPy实现")

八、总结

sys模块的核心就是让你操控Python解释器:

分类常用属性/函数
系统信息version, version_info, platform, executable
内存getsizeof(), maxsize, float_info
命令行argv
模块管理path, modules
标准流stdin, stdout, stderr
程序控制exit(), exc_info(), getrecursionlimit()
编码getdefaultencoding(), byteorder

sys模块在写CLI工具、调试程序、处理跨平台兼容性时特别有用。记住sys.argvsys.pathsys.exit()这三个用得最多就行。