我从别人那里得到了一个脚本。并且有一个模块导入到脚本中。我想知道找出安装此库的 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 名称。也就是说,如果您无论如何都不熟悉该软件包,您可能会想要在互联网上查找文档和更多信息。我想还需要查一件事。
如果您没有安装该软件包,则必须使用 pip 搜索或诗歌搜索(或 Google 搜索)。
如果您已经安装了软件包(即您可以导入它),您可以使用 importlib.metadata 获取软件包名称:
importlib.metadata。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”的软件包,安装它并根据需要使用它。
| 归档时间: |
|
| 查看次数: |
2430 次 |
| 最近记录: |