Python sys 模块
Python3 学习笔记 · 整理自菜鸟教程
一句话
sys 模块直接与 Python 解释器打交道:读命令行参数、控制标准输入输出、调整模块搜索路径、退出程序,都靠它。
要点
sys.argv:命令行参数列表,第 0 个是脚本名,其后才是用户传入的参数。sys.exit([code]):退出程序,本质是抛出SystemExit;0表示正常,非0表示出错。sys.path:模块搜索路径列表,运行时可append/insert动态加目录。sys.stdin/sys.stdout/sys.stderr:三个标准流,可重定向。sys.version返回字符串,sys.version_info返回可比较的元组。sys.platform:平台标识(darwin/win32/linux)。sys.modules:已加载模块的字典,可用来判断模块是否已导入。sys.getsizeof(obj):对象占用字节数(含解释器开销,非精确内存)。sys.maxsize:当前平台Py_ssize_t最大值,常当“无限大”用。sys.setrecursionlimit()/sys.getrecursionlimit():读写递归深度上限。sys.getdefaultencoding():解释器默认编码,通常是utf-8。sys.exc_info():返回当前异常三元组(类型, 值, traceback)。
语法 / 常用方法
| 语法/方法 | 说明 | 示例 |
|---|---|---|
sys.argv |
命令行参数列表 | sys.argv[1:] 取用户参数 |
sys.exit(code) |
退出程序 | sys.exit(1) |
sys.path |
模块搜索路径 | sys.path.insert(0, './lib') |
sys.stdin |
标准输入流 | sys.stdin.readline() |
sys.stdout |
标准输出流 | sys.stdout.write('hi') |
sys.stderr |
标准错误流 | print('err', file=sys.stderr) |
sys.version |
版本字符串 | '3.12.0 ...' |
sys.version_info |
版本元组 | sys.version_info >= (3, 8) |
sys.platform |
平台名 | 'darwin' |
sys.modules |
已加载模块字典 | 'os' in sys.modules |
sys.getsizeof(obj) |
对象字节大小 | sys.getsizeof([1,2]) |
sys.maxsize |
最大整型值 | 2**63-1 |
sys.setrecursionlimit(n) |
设置递归上限 | sys.setrecursionlimit(5000) |
sys.getrecursionlimit() |
读取递归上限 | 默认 1000 |
sys.getdefaultencoding() |
默认编码 | 'utf-8' |
sys.exc_info() |
当前异常信息 | 在 except 中调用 |
sys.executable |
解释器可执行文件路径 | 子进程调用自己时用 |
sys.byteorder |
字节序 | 'little' / 'big' |
代码示例
1 | |
易错点
sys.argv[0]是脚本名,不是第一个参数;取用户参数应从sys.argv[1:]开始,且要防越界。sys.exit(1)是主动退出,不是崩溃;在try里会被except SystemExit捕获,别乱吞。sys.path修改只影响当前进程,重启即失效;别把它当永久配置。sys.modules里存在某模块不代表导入成功(可能是半初始化状态),判断“是否装了”应更谨慎。sys.getsizeof只算对象本身,不含它引用的子对象,别用来估算整个数据结构的真实内存。- 改
sys.setrecursionlimit只是放宽上限,过深仍可能让 C 栈溢出崩溃,递归深还是要改迭代。