Python:如何找到库所属的 pip 包?

Sua*_*guo 6 python pip

我从别人那里得到了一个脚本。并且有一个模块导入到脚本中。我想知道找出安装此库的 pip 包的最佳方法是什么(在线搜索除外)。

我尝试导入包,然后只对它执行 help() 但没有得到太多信息。有没有可靠和pythonic的方法来实现这一目标?

例如:

在脚本中它有一行

from impala.dbapi import connect
Run Code Online (Sandbox Code Playgroud)

不用在网上搜索,我怎么知道下面的包可以安装这个库?正如您在这种情况下所看到的,包名称与 pip 中使用的名称不同。

pip install impyla
Run Code Online (Sandbox Code Playgroud)

Erd*_*con 12

简短的回答:你不能。

核心原因是导入包的名称和安装包的名称来自不同的命名空间。当您运行 import 命令时,Python 会在本地环境中查找包。当你告诉 pip 安装一个包时,它会从 PyPI 寻找要安装的东西(或者如果你告诉 pip 在其他地方寻找,则从其他地方寻找)。

这两个名称始终相同是有道理的,但不能保证安装是选择要下载和安装哪组文件的问题,而导入是选择要运行哪些已安装文件的问题,但这些文件的名称在安装过程中不必保持不变。这就是我们如何得到诸如pip install impyla,之类的混乱import impala

如果您有权访问setup.py该包的文件,则可以在其中查找名称(如果您查看 GitHub 上的 impyla/impala,您将name='impyla',在对 的调用中看到一行setup),但如果该包是通过pip,您在本地不会有该setup.py文件,所以这个选项几乎是正确的。

这不是一个很好的情况。根本无法保证您可以通过本地访问包代码和包的“真实”导入名称来找到包的 PyPI 名称。也就是说,如果您无论如何都不熟悉该软件包,您可能会想要在互联网上查找文档和更多信息。我想还需要查一件事。


np8*_*np8 8

如果您没有安装该软件包,则必须使用 pip 搜索或诗歌搜索(或 Google 搜索)。

如果您已经安装了软件包(即您可以导入它),您可以使用 importlib.metadata 获取软件包名称:

使用示例:

>>> from importlib.metadata import packages_distributions

>>> packages_distributions()

 'asttokens': ['asttokens'],
 'backcall': ['backcall'],
 'bitarray': ['bitarray'],
 'colorama': ['colorama'],
 'decorator': ['decorator'],
 'executing': ['executing'],
 'importlib_metadata': ['importlib-metadata'],
 'impala': ['impyla'],
 'IPython': ['ipython'],
 'jedi': ['jedi'],
 'matplotlib_inline': ['matplotlib-inline'],
 'parso': ['parso'],
 'pickleshare': ['pickleshare'],
 'pip': ['pip'],
 'prompt_toolkit': ['prompt-toolkit'],
 'pure_eval': ['pure-eval'],
 'puresasl': ['pure-sasl'],
 'pygments': ['Pygments'],
 '_distutils_hack': ['setuptools'],
 'pkg_resources': ['setuptools'],
 'setuptools': ['setuptools'],
 'six': ['six'],
 'stack_data': ['stack-data'],
 'thrift': ['thrift'],
 'thrift_sasl': ['thrift-sasl'],
 'traitlets': ['traitlets'],
 'wcwidth': ['wcwidth'],
 'zipp': ['zipp']}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将寻找"impala"在这种情况下,您将在字典中packages_distributions()

>>> packages_distributions()['impala']
['impyla']
Run Code Online (Sandbox Code Playgroud)

您还可以检查例如包的版本:

>>> from importlib.metadata import version

>>> # Note: Using the name of the package, not the "import name"
>>> version('impyla')
'0.18.0'
Run Code Online (Sandbox Code Playgroud)
奖励:从函数或类名中检查模块的名称
>>> connect.__module__.split('.')[0]
'impala'
Run Code Online (Sandbox Code Playgroud)

请注意,这并不能保证包是从 PyPI 安装的。如果您愿意,您可以创建自己的名为“impyla”、“matplotlib”的软件包,安装它并根据需要使用它。