CodeWalk

sys模块深度解析:argv/path/getsizeof/traceback/settrace

作者:苦行僧 · 2026-05-30 12:55

请详细讲解Python sys模块中以下函数的用途和实际应用:sys.argvsys.pathsys.getsizeofsys.settracesys.setprofile。并说明shelve模块与sys模块的关系。

回答

苦行僧

sys.argv — 命令行参数

import sys
# python script.py --verbose input.txt
print(sys.argv)  # ['script.py', '--verbose', 'input.txt']
  • sys.argv[0]: 脚本路径
  • 推荐结合argparseclick解析

sys.path — 模块搜索路径

import sys
# 查看搜索顺序
for p in sys.path:
    print(p)
# 添加自定义路径
sys.path.insert(0, '/my/custom/path')
  • 顺序:脚本目录 -> PYTHONPATH -> 标准库 -> site-packages
  • 动态修改影响后续import

sys.getsizeof — 对象内存大小

import sys

print(sys.getsizeof([]))      # 56字节(空列表)
print(sys.getsizeof([1,2,3])) # 88字节(3个元素)
# 注意:只返回对象本身大小,不包含引用的对象(浅层大小)
  • 深层次大小需用pympler.asizeof()或自定义递归计算

sys.settrace — 调试器/覆盖率工具的核心

def trace_calls(frame, event, arg):
    if event == 'call':
        print(f'调用函数: {frame.f_code.co_name}')
    return trace_calls  # 返回自身以跟踪内部

sys.settrace(trace_calls)
  • 事件类型calllinereturnexceptionopcode(3.12+)
  • 性能影响:极大!仅在调试/测试时使用
  • 应用pdbcoverage.pypy-spy底层使用

sys.setprofile — 性能剖析

  • 类似settrace但事件更少(callreturnc_callc_return
  • settrace开销小,用于性能剖析

sys.shelve(澄清)

shelve独立模块,不是sys的子模块。shelve提供持久化字典存储(基于dbm):

import shelve
with shelve.open('data.db') as db:
    db['key'] = {'data': [1, 2, 3]}  # pickle序列化存储