是的,我对这个问题非常认真。如何使用pip进行搜索?
关键字search
的文档引用了https://pip.pypa.io/en/stable/user_guide/#searching-for-packages
处的"pip搜索引用",它除了引用之外什么都不是。
我无法从搜索尝试中得出搜索是如何工作的结论。例如,如果我搜索"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究竟是如何进行搜索的呢?在哪里可以找到合适的参考资料?
pip search
查找包含在分发名称或分发摘要中的子字符串。我在任何地方都看不到这篇文档,而是直接按照源代码中的命令找到的。
搜索功能的代码从2010年2月开始,仍然使用旧的xmlrpc_client
。由于XML-RPC API现在被认为是遗留的,不应该使用,因此有问题395要改变这一点,自2011年以来一直开放。令人惊讶的是,在pypi遗留到仓库的移动中,端点并没有被弃用,因为遗留路由仍然存在。
flask-macros
没有出现在"项目"的搜索中,因为这是一个太常见的搜索词。只返回100个结果,这是弹性搜索视图中的硬编码限制,该视图处理对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)
编辑:现在这里记录了100个结果的限制。