如何获取所有Python标准库模块的列表?

60 投票
12 回答
24517 浏览
提问于 2025-04-16 20:12

我想要一个类似于 sys.builtin_module_names 的东西,但它是关于标准库的。其他一些尝试过的方法没有成功:

  • sys.modules - 这个只显示已经加载的模块。
  • sys.prefix - 这个是一个路径,包含了一些非标准库的模块,而且在虚拟环境中似乎也不太管用。

我想要这个列表的原因是,我想把它传递给 trace 的命令行选项 --ignore-module--ignore-dir

所以最终,我想知道在使用 tracesys.settrace 时,如何忽略所有标准库模块。

12 个回答

24

Python 版本 >= 3.10:

sys.stdlib_module_names

Python 版本 < 3.10:

一个叫做 isort 的工具的作者,曾经也遇到过类似的问题。他需要解决这个问题,以满足 pep8 的要求:核心库的导入应该排在第三方库的前面。

我一直在使用这个工具,感觉效果不错。你可以在 isort.py 文件中使用 place_module 这个方法:

>>> from isort import place_module
>>> place_module("json")
'STDLIB'
>>> place_module("requests")
'THIRDPARTY'

或者你也可以直接获取一组模块名称,这个取决于你使用的 Python 版本,比如:

>>> from isort.stdlibs.py39 import stdlib
>>> for name in sorted(stdlib): print(name)
... <200+ lines>
xml
xmlrpc
zipapp
zipfile
zipimport
zlib
zoneinfo
36

我通过写一些代码来强行获取官方Python文档中标准库页面的目录。还为获取标准库列表(适用于Python版本2.6、2.7、3.2、3.3和3.4)建立了一个简单的API。

这个包可以在这里找到,使用起来也很简单:

>>> from stdlib_list import stdlib_list
>>> libraries = stdlib_list("2.7")
>>> libraries[:10]
['AL', 'BaseHTTPServer', 'Bastion', 'CGIHTTPServer', 'ColorPicker', 'ConfigParser', 'Cookie', 'DEVICE', 'DocXMLRPCServer', 'EasyDialogs']
20

为什么不自己弄清楚哪些是标准库的一部分呢?

import distutils.sysconfig as sysconfig
import os
std_lib = sysconfig.get_python_lib(standard_lib=True)
for top, dirs, files in os.walk(std_lib):
    for nm in files:
        if nm != '__init__.py' and nm[-3:] == '.py':
            print os.path.join(top, nm)[len(std_lib)+1:-3].replace(os.sep, '.')

结果是

abc
aifc
antigravity
--- a bunch of other files ----
xml.parsers.expat
xml.sax.expatreader
xml.sax.handler
xml.sax.saxutils
xml.sax.xmlreader
xml.sax._exceptions

补充:如果你想避免使用非标准库的模块,可能需要加一个检查,来排除 site-packages

撰写回答