(1)获取旧版本的标准库(比如 3.10.0),序列化后存储到文件/数据库中
>>> import sys >>> import pickle >>> with open("libs", "wb") as f: ... pickle.dump(sys.stdlib_module_names, f) ...
(2)获取新版本的标准库(比如 3.11.0),与旧版本的标准库进行比较
>>> 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'})
从以上示例中,我们可以得知,3.11 相比于 3.10 增加了_typing
、_scproxy
、_tokenize
以及 tomllib
,同时它也减少了一个binhex
。
简简单单几行代码,这种方法比翻阅繁杂的文档要便捷且准确得多了。
值得注意的是,sys.stdlib_module_names
是 3.10 版本的新特性,在它之前,有一个相似的sys.builtin_module_names
,但它返回的只是被解释器使用到的内置模块:
那么,除了上文提到的获知 Python 标准库删减情况的用途之外,这个新特性还有什么用处呢?换句话说,Python 官方为什么突然新增了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 也需要这项功能。
标签:python,导入机制原理,文件格式,函数,目录 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。