使用 pip 搜索如何工作?

Reg*_*May 6 python search pip pypi

是的,我对这个问题很认真。使用 pip 搜索如何工作?

关键字的文档search指的是“pip 搜索参考”,https://pip.pypa.io/en/stable/user_guide/#searching-for-packages其中除了参考之外的所有内容。

我无法从搜索尝试中得出搜索是如何工作的结论。例如,如果我搜索“exec”,我会得到各种结果,例如exec-pypeline (0.4.2) - an incredible python package. 我什至得到与“exec”无关的包名结果,只要描述中包含“exec”一词。

但奇怪的是,尽管其中一个包exec的名称中包含我自己的包之一,但我没有在列表中看到我自己的包之一。现在仅凭这一点就可以得出结论,pip(至少)会在包描述(我的包没有)中搜索完整的搜索词。

但是基于这个假设,如果我搜索包描述中提供的其他术语,我也不会列出我的包。这也适用于其他包:例如,如果我搜索“项目”,我不会进入flask-macros结果集中,尽管flask-macros. 因此,由于这与上述假设相矛盾,这显然不是搜索的工作方式。

有趣的是,我可以搜索“macro”并得到“flask-macros”,但是如果我搜索“macr”,则找不到“flask-macros”。

那么 pip 究竟是如何进行搜索的呢?在哪里可以找到合适的参考资料?

wim*_*wim 4

pip search查找发行版名称中包含的子字符串分发摘要中包含的子字符串。我在任何地方都看不到这个记录,而是通过直接按照源代码中的命令找到它。

搜索功能的代码可追溯至 2010 年 2 月,仍在使用旧的xmlrpc_client. 从 2011 年开始就有了issues395来改变这一点,因为 XML-RPC API 现在被认为是遗留的,不应该被使用。有点令人惊讶的是,在 pypi 遗留到仓库的迁移中,端点并未被弃用,因为遗留路由仍然存在

flask-macros没有出现在“项目”的搜索中,因为这是一个太常见的搜索词。仅返回 100 个结果,这是 elasticsearch 视图中的硬编码限制这是处理对这些 PyPI 搜索路由的请求的请注意,最近在PR3827中,该数量已从 1000 减少。

直接使用 API 客户端进行搜索的代码:

import xmlrpc.client

client = xmlrpc.client.ServerProxy('https://pypi.org/pypi')
query = 'project'
results = client.search({'name': query, 'summary': query}, 'or')
print(len(results), 'results returned')
for result in sorted(results, key=lambda data: data['name'].lower()):
    print(result)
Run Code Online (Sandbox Code Playgroud)

编辑: 100 个结果限制现在记录在此处