首页 > 解决方案 > 如何确定 PyPI 包中可用的模块

问题描述

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

细节

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

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

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

可能的解决方案空间

看起来他们可能富有成果的领域(但我还没有成功)是:

标签: pythonmodulesetuptoolspypipython-packaging

解决方案


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

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

请注意,有些发行版导出多个顶级名称,有些发行版根本不导出,并且发行版名称(与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']

推荐阅读