如何确定 PyPI 包中可用的模块
How to determine the modules available in a PyPI package
给定一个 PyPI 包名称,例如 PyYAML
,如何以编程方式
确定可以导入的包(分发包)中可用的模块?
详情
我对 PyYAML
不是特别感兴趣,它只是一个流行的 PyPI 包的一个很好的例子,它有不同的
包名 (PyYAML
)
从它的主要模块名称 (yaml
)
这样你就不容易从包名中猜出模块名了。
我看到其他问题的答案听起来像这样但不同,可能是因为命名冲突
我的问题是关于分发包和其中的模块之间的关系。
可能的解决方案空间
看起来可能富有成效的领域(但我还没有取得成功)是:
pydoc.help
函数
(显示为 help
built-in)
当调用 help('modules')
时,输出所有 可用 模块的完整列表。这个
显示尚未导入但可能导入的模块。它以人类可读的形式输出
到标准输出,我一直无法弄清楚 the pydoc
code
枚举模块。
- 我可以想象调用它,收集模块列表,将新的分发包安装到 virtualenv 中
以编程方式 pip,再次调用它并比较结果。
- 使用 pip 以编程方式安装分发包以便
- 遍历 python 路径的元素以查找模块
我的项目 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']
给定一个 PyPI 包名称,例如 PyYAML
,如何以编程方式
确定可以导入的包(分发包)中可用的模块?
详情
我对 PyYAML
不是特别感兴趣,它只是一个流行的 PyPI 包的一个很好的例子,它有不同的
包名 (PyYAML
)
从它的主要模块名称 (yaml
)
这样你就不容易从包名中猜出模块名了。
我看到其他问题的答案听起来像这样但不同,可能是因为命名冲突
我的问题是关于分发包和其中的模块之间的关系。
可能的解决方案空间
看起来可能富有成效的领域(但我还没有取得成功)是:
pydoc.help
函数 (显示为help
built-in) 当调用help('modules')
时,输出所有 可用 模块的完整列表。这个 显示尚未导入但可能导入的模块。它以人类可读的形式输出 到标准输出,我一直无法弄清楚 thepydoc
code 枚举模块。- 我可以想象调用它,收集模块列表,将新的分发包安装到 virtualenv 中 以编程方式 pip,再次调用它并比较结果。
- 使用 pip 以编程方式安装分发包以便
- 遍历 python 路径的元素以查找模块
我的项目 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']