python - 如何确定 PyPI 包中可用的模块
问题描述
给定一个 PyPI 包名称,例如PyYAML
,如何以编程方式确定包(分发包)中可以导入的可用模块?
细节
我不是特别感兴趣PyYAML
,它只是一个流行的 PyPI 包的一个很好的例子,它的包名(PyYAML
)与它的主模块名(yaml
)不同,这样你就不能轻易地从包名中猜出模块名。
我已经看到其他听起来像这样但不同的问题的答案,可能是因为命名冲突
我的问题是关于分发包和其中的模块之间的关系。
可能的解决方案空间
看起来他们可能富有成果的领域(但我还没有成功)是:
- 该
pydoc.help
函数(显示为help
built-in )在调用时输出所有可用模块的完整列表help('modules')
。这显示了尚未导入但可能已导入的模块。它以人类可读的形式输出到标准输出,我一直无法弄清楚代码是如何 枚举模块的 。pydoc
- 我可以想象调用它,收集模块列表,以编程方式使用 pip 将新的分发包安装到 virtualenv 中,再次调用它并区分结果。
- 使用 pip 以编程方式安装分发包,以便
- 遍历 python 路径的元素以查找模块
解决方案
我的项目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']
推荐阅读
- excel - VBA: Exporting charts from Excel to PowerPoint, but my PowerPoint Application crashes without an error message
- ios - 当我添加 Google 移动广告 SDK 时,Flutter ios pod install 出现此错误。关于如何解决的任何想法?
- axios - NestJS FilesInterceptor 不解析来自 Axios 请求的文件
- vb.net - 如何使用 Compareto 修复字典中的 Visual Studio 警告 CA1310 按值排序?
- ios - pod install 错误>>> 无法确定 `SocketSwift` 目标的平台
- html - HTML 下载页面而不是内容
- javascript - 如何从文本字段中获取用户输入并将其显示在网页上?
- powershell - How to get PSComputerName and non-object return value of an Invoke-Command statement
- javascript - how to make the option elements and append them as the innerHTML of the select element?
- tensorflow - Distributing dictionary of tensor values to bigger tensor