如何获取所有Python标准库模块的列表?
我想要一个类似于 sys.builtin_module_names
的东西,但它是关于标准库的。其他一些尝试过的方法没有成功:
sys.modules
- 这个只显示已经加载的模块。sys.prefix
- 这个是一个路径,包含了一些非标准库的模块,而且在虚拟环境中似乎也不太管用。
我想要这个列表的原因是,我想把它传递给 trace
的命令行选项 --ignore-module
或 --ignore-dir
。
所以最终,我想知道在使用 trace
或 sys.settrace
时,如何忽略所有标准库模块。
12 个回答
24
Python 版本 >= 3.10:
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
。