繁体   English   中英

Python:如何找到图书馆属于哪个pip package?

[英]Python: How do I find which pip package a library belongs to?

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

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

例如:

在脚本中有一行

from impala.dbapi import connect

不在inte.net上搜索,怎么知道下面package可以安装这个库呢? 如您所见,在这种情况下,package 名称与 pip 中使用的名称不同。

pip install impyla

简短的回答:不能。

原因的核心是导入软件包的名称和安装软件包的名称来自不同的命名空间。 当您运行import命令时,Python在本地环境中寻找软件包。 当您告诉pip安装软件包时,它正在寻找要从PyPI安装的内容(如果您告诉pip去其他地方,则需要其他位置)。

将使意义,这两个名字总是相同的,但不能保证。 安装是选择要下载和安装的文件集的问题,而导入是选择要运行的已安装文件的问题,但是这些文件的名称在安装过程中不必保持相同。 这就是我们如何混淆pip install impylaimport impala

如果您可以访问该软件包的setup.py文件,则可以在其中查找名称(如果您在GitHub上查看impyla / impala,则会看到一个name='impyla',行位于setup ),但是如果该软件包是通过pip安装的,则您将不会在本地安装setup.py文件,因此该选项非常合适。

这不是一个大问题。 不能完全保证您可以从本地访问该软件包的代码和该软件包的“真实”导入名称来找到该软件包的PyPI名称。 就是说,如果您仍然不熟悉该程序包,则可能仍要在Internet上查找文档和更多信息。 我想,还需要查找另一件事。

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

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

使用示例:

>>> 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']}

在这种情况下,您将在packages_distributions()字典中查找"impala"条目:

>>> packages_distributions()['impala']
['impyla']

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

>>> from importlib.metadata import version

>>> # Note: Using the name of the package, not the "import name"
>>> version('impyla')
'0.18.0'
奖励:从 function 或 class 名称中检查模块的名称
>>> connect.__module__.split('.')[0]
'impala'

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM