使用pip进行搜索是如何工作的?

6 浏览
0 Comments

使用pip进行搜索是如何工作的?

是的,我对这个问题非常认真。pip如何进行搜索?\n关键字search的文档提到了一个名为“pip search reference”的链接https://pip.pypa.io/en/stable/user_guide/#searching-for-packages,但这个链接并不是一个参考文献。\n我无法通过搜索尝试来推断搜索的工作原理。例如,如果我搜索“exec”,我会得到各种结果,比如exec-pypeline (0.4.2) - an incredible python package。我甚至会得到一些与“exec”无关的包名的结果,只要描述中包含“exec”这个词。\n但奇怪的是,我在列表中看不到自己的一个包,尽管其中一个包的名称中包含了exec。仅凭这一点,我们可以得出结论,pip(至少)会在包描述中搜索完整的搜索词(而我的包没有这个描述)。\n但是,如果我搜索包描述中提供的其他术语,我的包也不会出现在列表中。其他包也是如此:例如,如果我搜索“projects”,在结果集中我得不到flask-macros,尽管“projects”这个词在flask-macros的描述中明确存在。因此,这与上述假设相矛盾,显然这不是搜索的方式。\n有趣的是,我可以搜索“macro”并得到“flask-macros”作为结果,但如果我搜索“macr”,则无法找到“flask-macros”。\n那么,pip到底是如何进行搜索的?哪里可以找到适当的参考资料?

0
0 Comments

pip搜索命令pip search会在分发名称或分发摘要中寻找包含子字符串的内容。这一点没有在任何文档中找到,我是通过直接查看源代码(点击查看源代码)找到的。

搜索功能的代码来自于2010年2月,仍然使用着旧的xmlrpc_client。由于XML-RPC API现在被认为是遗留的,不应再使用,因此有一个issue395去进行更改,该问题自2011年以来一直处于开放状态。令人惊讶的是,在pypi-legacy到warehouse的迁移中,并未将此端点废弃,因为遗留路由仍然存在

"flask-macros"在搜索"project"时没有显示出来,因为"project"是一个太常见的搜索词。这些PyPI搜索路由的请求由elasticsearch视图处理,该视图中设置了返回结果的上限,目前设置为只返回100个结果。此设置在elasticsearch视图的源代码中被硬编码。值得注意的是,这个上限是在最近的PR3827中从1000个减少到了100个。

以下是使用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)

如果这是情况,那么当我搜索"project"时,应该可以找到"flask-macros"包。但事实并非如此。而且,如果这是情况,搜索"simpleexec"应该会返回我的其中一个包。但实际上并没有。而且,如果我搜索"macr","flask-macros"包也没有被返回,但它应该被返回。请参阅我上面的问题。这就是为什么我在问。

这只返回100个结果的限制是没有被记录的。

我知道这没有记录下来。但这已经经过测试:github.com/pypa/warehouse/blob/...

我在GitHub上联系了项目维护者,他们刚刚更新了文档

0