如果您只是按要求考虑builtins
,那么接受的答案显然是正确的。
就我而言,我也在寻找标准库,我的意思是一个给定 Python 发行版附带的所有可导入模块的列表。已多次提出有关此问题的问题,但我找不到包含我正在寻找的所有内容的答案。
我的用例是x
在 Pythonimport x
语句中任意存储一个:
- 包含在 Python 标准库 + 内置程序中
- 作为第三方模块安装
- 两者都不
这将适用于 virtualenvs 或全局安装。它查询运行脚本的任何 python 二进制文件的分布。最后一块确实超出了virtualenv,但我认为这是所需的行为。
# You may need to use setuptools.distutils depending on Python distribution (from setuptools import distutils)
import distutils
import glob
import os
import pkgutil
import sys
def get_python_library():
# Get list of the loaded source modules on sys.path.
modules = {
module
for _, module, package in list(pkgutil.iter_modules())
if package is False
}
# Glob all the 'top_level.txt' files installed under site-packages.
site_packages = glob.iglob(os.path.join(os.path.dirname(os.__file__)
+ '/site-packages', '*-info', 'top_level.txt'))
# Read the files for the import names and remove them from the modules list.
modules -= {open(txt).read().strip() for txt in site_packages}
# Get the system packages.
system_modules = set(sys.builtin_module_names)
# Get the just the top-level packages from the python install.
python_root = distutils.sysconfig.get_python_lib(standard_lib=True)
_, top_level_libs, _ = list(os.walk(python_root))[0]
return sorted(top_level_libs + list(modules | system_modules))
退货
排序的导入列表:[..., 'imaplib', 'imghdr', 'imp', 'importlib', 'imputil', 'inspect', 'io', ...]
说明:
我把它分成几块,这样每个组需要的原因就很清楚了。
modules
- 该
pkgutil.iter_modules
调用扫描所有加载的模块sys.path
并返回一个(module_loader, name, ispkg)
元组生成器。
- 我把它变成一个集合并过滤掉包,因为这里我们只关心源模块。
site_packages
- 获取常规站点包目录下所有已安装包的列表,并将它们从
modules
列表中删除。这大致对应于第三方部门。
- 这是最难做对的部分。许多事情几乎都奏效了,例如
pip.get_installed_distributions
or site
。但pip
返回 PyPi 上的模块名称,而不是导入源文件时的模块名称。某些病态包裹会从裂缝中溜走,例如:
requests-futures
导入为requests_futures
.
colors
,这实际上是ansicolors
在 PyPi 上,因此混淆了任何合理的启发式。
- 我确信有一些低使用率的模块不包含
top_level.txt
在他们的包中。但这涵盖了我 100% 的用例,似乎适用于正确配置的所有内容。
system_modules
- 如果您没有明确要求它们,您将不会获得这些系统模块,例如
sys
,gc
和errno
其他一些可选模块。
top_level_libs
结论
对于我的 2013 MacBookPro,我找到了 403 个模块进行python2.7
安装。
>>> print(sys.version)
2.7.10 (default, Jul 13 2015, 12:05:58)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)]
>>> print(sys.hexversion)
34015984
>>> python_stdlib = get_python_libirary()
>>> len(python_stdlib)
403
我提出了代码和输出的要点。如果您认为我错过了课程或包含了虚假模块,我想听听。
* 备择方案