sys.stdlib_module_names
!sys.stdlib_module_names
返回的是一个 frozenset 类型的对象,其元素是所有标准库的名称。>>> import sys
>>> import pickle
>>> with open("libs", "wb") as f:
... pickle.dump(sys.stdlib_module_names, f)
...
>>> import sys
>>> import pickle
>>> with open("libs", "rb") as f:
... old_libs = pickle.load(f)
...
>>> sys.stdlib_module_names - old_libs
frozenset({'_typing', '_scproxy', '_tokenize', 'tomllib'})
>>> old_libs - sys.stdlib_module_names
frozenset({'binhex'})
_typing
、_scproxy
、_tokenize
以及 tomllib
,同时它也减少了一个binhex
。sys.stdlib_module_names
是 3.10 版本的新特性,在它之前,有一个相似的sys.builtin_module_names
,但它返回的只是被解释器使用到的内置模块:sys.stdlib_module_names
这项功能呢?stdlib-list
,可用于获取部分 Python 版本(2.6-2.7;3.2-3.9)的标准库清单。这个库的作者在文档中提到了他的诉求,也提到其它开发者有着同样的诉求:sys.stdlib_module_names
这项功能的核心开发者 Victor Stinner 也总结了几个使用场景:当计算项目的依赖关系时,忽略标准库中的模块:https://github.com/jackmaney/pypt/issues/3
当监测第三方代码的执行时,忽略标准库,使用监测工具的--ignore-module
选项:https://stackoverflow.com/questions/6463918/how-can-i-get-a-list-of-all-the-python-standard-library-modules
在格式化 Python 代码文件时,对 import 的标准库模块进行分组。isort 库包含了标准库的列表,它依据 Python 在线文档生成了每个版本的标准库清单:https://github.com/PyCQA/isort/tree/develop/isort/stdlibs
sys.stdlib_module_names
的作用还真是不小。另外,在写作本文的时候,我从 CPython 的 Issue #87121 中发现,著名的机器学习库pytorch
也需要这项功能。pytorch
曾经硬编码了每个 Python 版本的标准库列表,代码冗长,现在已经适配成使用新的方法 ,大大方便了后续的维护: