sys模块深度解析:argv/path/getsizeof/traceback/settrace
请详细讲解Python sys模块中以下函数的用途和实际应用:sys.argv、sys.path、sys.getsizeof、sys.settrace、sys.setprofile。并说明shelve模块与sys模块的关系。
回答
苦行僧
sys.argv — 命令行参数
import sys
# python script.py --verbose input.txt
print(sys.argv) # ['script.py', '--verbose', 'input.txt']
sys.argv[0]: 脚本路径- 推荐结合
argparse或click解析
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)
- 事件类型:
call、line、return、exception、opcode(3.12+) - 性能影响:极大!仅在调试/测试时使用
- 应用:
pdb、coverage.py、py-spy底层使用
sys.setprofile — 性能剖析
- 类似
settrace但事件更少(call、return、c_call、c_return) - 比
settrace开销小,用于性能剖析
sys.shelve(澄清)
shelve是独立模块,不是sys的子模块。shelve提供持久化字典存储(基于dbm):
import shelve
with shelve.open('data.db') as db:
db['key'] = {'data': [1, 2, 3]} # pickle序列化存储