是的,我对这个问题非常认真。如何使用 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 就可以使我们得出结论,即 pip(至少)在包描述(我的包没有)中搜索完整的搜索词。
但是如果我搜索包描述中提供的其他术语,那么基于该假设我也不会列出我的包。这也适用于其他包:例如如果我搜索“projects”,我不会在结果集中得到 flask-macros
,尽管术语“projects”显然存在于 flask-macros
的描述中。因此,由于这与上述假设相矛盾,这显然不是搜索的工作方式。
有趣的是,我可以搜索“macro”并得到“flask-macros”作为结果,但如果我搜索“macr”,则找不到“flask-macros”。
那么 pip 究竟是如何进行搜索的呢?在哪里可以找到合适的引用资料?
最佳答案
pip search
查找分发名称或分发摘要中包含的子字符串。我在任何地方都看不到这个记录,并按照 the source code 中的命令找到了它。直接。
搜索功能的代码(日期为 2010 年 2 月)仍在使用旧的 xmlrpc_client
。有 issue395要更改此设置,自 2011 年起开放,因为 XML-RPC API 现在是 considered legacy and should not be used .有 pip 令人惊讶的是,端 pip 在 pypi-legacy 到仓库的移动中没有被弃用,因为 legacy routes are still there .
flask-macros
没有出现在“project”的搜索中,因为这是一个太常见的搜索词。仅返回 100 个结果,this is a hardcoded limit in the elasticsearch view它处理对那些 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 个结果限制 here .
关于python - 如何使用 pip 进行搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51269053/