如何确定 PyPI 包中可用的模块

How to determine the modules available in a PyPI package

给定一个 PyPI 包名称,例如 PyYAML,如何以编程方式 确定可以导入的包(分发包)中可用的模块?

详情

我对 PyYAML 不是特别感兴趣,它只是一个流行的 PyPI 包的一个很好的例子,它有不同的 包名 (PyYAML) 从它的主要模块名称 (yaml) 这样你就不容易从包名中猜出模块名了。

我看到其他问题的答案听起来像这样但不同,可能是因为命名冲突

我的问题是关于分发包和其中的模块之间的关系。

可能的解决方案空间

看起来可能富有成效的领域(但我还没有取得成功)是:

我的项目 johnnydep 提供了这个功能:

$ johnnydep --fields=import_names PyYAML
name    import_names
------  --------------
PyYAML  yaml

请注意,有些发行版导出多个顶级名称,有些发行版完全导出 none,并且发行版名称之间不一定有任何明显的关系(与 pip install 命令一起使用)和包名称(与 import 语句一起使用)- 尽管这是匹配它们的常见约定。

例如,热门项目setuptools公开了三个顶级名称:

$ johnnydep --fields=import_names setuptools 
name        import_names
----------  ---------------------------------------
setuptools  easy_install, pkg_resources, setuptools

API 用法是通过属性访问:

>>> from johnnydep.lib import JohnnyDist
>>> jdist = JohnnyDist("setuptools")
>>> jdist.import_names
['easy_install', 'pkg_resources', 'setuptools']

如果您有兴趣了解 子模块名称 ,而不是顶级名称,可以使用 stdlib pkgutil,例如:

>>> import pkgutil, requests
>>> [name for finder, name, ispkg in pkgutil.walk_packages(requests.__path__)]
['__version__',
 '_internal_utils',
 'adapters',
 'api',
 'auth',
 'certs',
 'compat',
 'cookies',
 'exceptions',
 'help',
 'hooks',
 'models',
 'packages',
 'sessions',
 'status_codes',
 'structures',
 'utils']