Python和pip,列出可用的软件包的所有版本?

Ror*_*ory 374 python pip

鉴于可以使用pipvirtualenv安装的Python(2.X)包的名称,有没有办法找到pip可以安装的所有可能版本的列表?现在它是试验和错误.

我正在尝试为第三方库安装一个版本,但最新版本太新了,进行了向后不兼容的更改.所以我想以某种方式列出pip知道的所有版本,以便我可以测试它们.

Chr*_*aro 700

对于pip> = 9.0使用

$ pip install pylibmc==
Collecting pylibmc==
  Could not find a version that satisfies the requirement pylibmc== (from 
  versions: 0.2, 0.3, 0.4, 0.5.1, 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5, 0.6.1, 0.6, 
  0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.7, 0.8.1, 0.8.2, 0.8, 0.9.1, 0.9.2, 0.9, 
  1.0-alpha, 1.0-beta, 1.0, 1.1.1, 1.1, 1.2.0, 1.2.1, 1.2.2, 1.2.3, 1.3.0)
No matching distribution found for pylibmc==
Run Code Online (Sandbox Code Playgroud)

- 将打印所有可用版本,而无需实际下载或安装任何其他软件包.

对于pip <9.0使用

pip install pylibmc==blork
Run Code Online (Sandbox Code Playgroud)

where blork可以是任何不太可能是安装候选的字符串.

  • 这似乎是在 pip 中执行此操作的唯一方法,这有点荒谬。我希望他们的错误跟踪器上至少有一个悬而未决的问题? (16认同)
  • 我发现奇怪的是pip的错误吐出了所有版本,但他们没有明确获取所述数据的论据 (15认同)
  • 我已经提交了 20.3 的问题:https://github.com/pypa/pip/issues/9252 (12认同)
  • 这应该标记为正确答案,因为它不需要安装任何其他软件包. (10认同)
  • 恢复旧行为的更好方法:`pip install django== --use-deprecated=legacy-resolver` (9认同)
  • `pip install pylibmc == 9999999 | tr','“ \ n” | 排序-n` (3认同)
  • 此解决方案的另一个不错的特性是它可以使用所有普通标志来限制安装源。例如`pip install --only-binary :all: pylibmc` 将列出所有可用的二进制包版本的 pylibmc。 (2认同)
  • 不幸的是,对于像 pip 那样重新发明轮子的包管理器来说,这种事情是司空见惯的。 (2认同)
  • 在任何版本的 pip 上,这似乎都不再起作用了。Pip &gt; 20.3 或 9.0.1 -- 他们现在将安装依赖项的 0.0.0 版本 (2认同)
  • 总结一下:[#9405](https://github.com/pypa/pip/pull/9405) 已合并,因此该功能可以在“main”分支上再次运行。使用 `pip install git+https://github.com/pypa/pip.git; pip installflask==` 自行查找。pip 的下一版本可能会删除对 `xyz==` 的支持(请参阅 [packaging#321](https://github.com/pypa/packaging/issues/321)),因此您可能需要使用 `xyz== 0` 代替。旧版解析器现在是一个单独的问题,将通过 [#9631](https://github.com/pypa/pip/pull/9631) 删除。杰克没说什么坏话,我误读了他的评论。我很笨。 (2认同)

m00*_*000 154

pastebin上的脚本确实有效.但是,如果您使用多个环境/主机,则不太方便,因为您每次都必须复制/创建它.

一个更好的全方位解决方案是使用yolk,可以用pip安装.例如,看看哪些版本的Django可用:

$ pip install yolk3k
$ yolk -V django
Django 1.3
Django 1.2.5
Django 1.2.4
Django 1.2.3
Django 1.2.2
Django 1.2.1
Django 1.2
Django 1.1.4
Django 1.1.3
Django 1.1.2
Django 1.0.4
Run Code Online (Sandbox Code Playgroud)

一个小小的警告:蛋黄取决于分发.这不是一件坏事,但如果您因某些原因需要坚持使用(已弃用的)python setuptools,则可能会出现问题.

注意:我没有参与蛋黄的开发.如果某些东西看起来不能正常工作,那么在这里发表评论应该没有多大区别.如果可能,请使用yolk问题跟踪器并考虑提交修复程序.

  • 大多数时候它只会返回最新版本 (24认同)
  • Fir python3只需使用pip install yolk3k.yolk命令将可用. (16认同)
  • 蛋黄破损/不再保存。删除这个答案。 (10认同)
  • 像蛋黄一样,大多数时候yolk3k只返回最新版本. (6认同)
  • 下面的答案(使用来自pastebin的脚本)更麻烦,​​但至少在我的情况下工作(搜索scipy的版本).yolk只显示最后一个版本可用,另一个脚本显示所有版本可追溯到0.8.0. (4认同)
  • @Flimm:shtuff.it将他们的显示名称更改为Chris Montanaro.链接答案:http://stackoverflow.com/a/26664162/473899 (3认同)
  • @PawelRoman Yolk 只返回 PyPi 上列出的内容。您是否发现过 PyPi 上列出版本但 yolk 未返回版本的情况?如果 PyPi 上未列出某些内容,则可能应将其视为已弃用。 (2认同)
  • @Esteis:这是更短的:`pip install somepackage==-1`。或 0 自担风险。 (2认同)
  • yolk给出urllib2.HTTPError:HTTP错误403:必须使用HTTPS而不是HTTP进行访问 (2认同)
  • 在我的 python 2.6 和 python 2.7 环境中不起作用:yolk -V elasticsearch Traceback(最近一次调用):文件“/usr/lib64/python2.6/urllib2.py”,第 518 行,在 http_error_default raise HTTPError( req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP 错误 403: 必须使用 HTTPS 而不是 HTTP 访问 (2认同)
  • 蛋黄死了,维护者消失了。正如 Tagar 所说,它不使用 PyPi 现在要求的 HTTPS。使用下面 ChrisMontanaro 的回答。 (2认同)
  • 错误答案:不再工作,仅返回最后一个版本 (2认同)

HVN*_*ing 70

更新:
截至2017年9月,此方法不再有效:--no-install已在第7点删除

使用pip install -v,您可以看到所有可用的版本

root@node7:~# pip install web.py -v
Downloading/unpacking web.py
  Using version 0.37 (newest of versions: 0.37, 0.36, 0.35, 0.34, 0.33, 0.33, 0.32, 0.31, 0.22, 0.2)
  Downloading web.py-0.37.tar.gz (90Kb): 90Kb downloaded
  Running setup.py egg_info for package web.py
    running egg_info
    creating pip-egg-info/web.py.egg-info
Run Code Online (Sandbox Code Playgroud)

要不安装任何软件包,请使用以下解决方案之一:

root@node7:~# pip install --no-deps --no-install flask -v                                                                                                      
Downloading/unpacking flask
  Using version 0.10.1 (newest of versions: 0.10.1, 0.10, 0.9, 0.8.1, 0.8, 0.7.2, 0.7.1, 0.7, 0.6.1, 0.6, 0.5.2, 0.5.1, 0.5, 0.4, 0.3.1, 0.3, 0.2, 0.1)
  Downloading Flask-0.10.1.tar.gz (544Kb): 544Kb downloaded
Run Code Online (Sandbox Code Playgroud)

要么

root@node7:~# cd $(mktemp -d)
root@node7:/tmp/tmp.c6H99cWD0g# pip install flask -d . -v
Downloading/unpacking flask
  Using version 0.10.1 (newest of versions: 0.10.1, 0.10, 0.9, 0.8.1, 0.8, 0.7.2, 0.7.1, 0.7, 0.6.1, 0.6, 0.5.2, 0.5.1, 0.5, 0.4, 0.3.1, 0.3, 0.2, 0.1)
  Downloading Flask-0.10.1.tar.gz (544Kb): 4.1Kb downloaded
Run Code Online (Sandbox Code Playgroud)

用pip 1.0测试

root@node7:~# pip --version
pip 1.0 from /usr/lib/python2.7/dist-packages (python 2.7)
Run Code Online (Sandbox Code Playgroud)

  • `pip 1.5.4`给`DEPRECATION: - no-install, - no-download, - build和--no-clean不推荐使用.请参阅https:// github.com/pypa/pip/issues/906.并且不显示已安装的软件包的可用版本. (9认同)
  • 要显示所有版本,它只需要“-v”。我的其余答案是为了避免附加效果(安装/下载)。对于已安装的 pkg,只需添加 --upgrade。Anw,您可以创建一个单独的 virtualenv 使一切变得更简单。 (2认同)
  • pip 9.0.1 barks:`没有这样的选项:--no-install` (2认同)

eri*_*ang 54

您不需要第三方软件包来获取此信息.pypi为所有包提供简单的JSON提要

https://pypi.python.org/pypi/{PKG_NAME}/json
Run Code Online (Sandbox Code Playgroud)

这里有一些Python代码只使用标准库来获取所有版本.

import json
import urllib2
from distutils.version import StrictVersion

def versions(package_name):
    url = "https://pypi.python.org/pypi/%s/json" % (package_name,)
    data = json.load(urllib2.urlopen(urllib2.Request(url)))
    versions = data["releases"].keys()
    versions.sort(key=StrictVersion)
    return versions

print "\n".join(versions("scikit-image"))
Run Code Online (Sandbox Code Playgroud)

该代码打印(截至2015年2月23日):

0.7.2
0.8.0
0.8.1
0.8.2
0.9.0
0.9.1
0.9.2
0.9.3
0.10.0
0.10.1
Run Code Online (Sandbox Code Playgroud)

  • JSON具有大量的嵌套。我使用了`versions = [x for data [“ releases”]中的x(如果有[[y [“ python_version”]在['cp26','2.6']中用于data中的y [[releases]] [x]]) ]`查找与Python 2.6兼容的版本。(我在任何地方都没有看到“ cp26”,但是某些软件包具有“ cp27”,因此我推测这可能存在于其他软件包中。) (2认同)
  • 这是处理curl,jq和sort(“单线”!)的一种方法:`curl -s https://pypi.python.org/pypi/{PKG_NAME}/json | jq -r'.releases | 键[]'| 排序-t。-k 1,1n -k 2,2n -k 3,3n` (2认同)
  • 对于某些遵循不那么严格的版本控制方案的包,这会引发 `ValueError` 异常。要为这些包修复它,[请参阅此要点](https://gist.github.com/trinitronx/026574839d96a0c0efe1e9f2fd300f03)。 (2认同)
  • 令人烦恼的是,StrictVersion 不适用于名称中带有“dev”的包。 (2认同)
  • @AlanIvey 的评论现在失败,并显示“解析错误:第 1 行第 23 列的数字文字无效”,因为 pypi.python.org 变成了 pypi.org,例如 Timofey Stolbov 的答案或将 -L 添加到curl,就像其他人一样说 (2认同)

Eug*_*ash 18

您可以使用这个小的 Python 3 脚本(仅使用标准库模块)从使用JSON API 的PyPI 获取包的可用版本列表,并按时间倒序打印它们。与此处发布的其他一些 Python 解决方案不同,这不会在诸如django's2.2rc1uwsgi's 之类的松散版本上中断2.0.17.1

#!/usr/bin/env python3

import json
import sys
from urllib import request    
from pkg_resources import parse_version    

def versions(pkg_name):
    url = f'https://pypi.python.org/pypi/{pkg_name}/json'
    releases = json.loads(request.urlopen(url).read())['releases']
    return sorted(releases, key=parse_version, reverse=True)    

if __name__ == '__main__':
    print(*versions(sys.argv[1]), sep='\n')
Run Code Online (Sandbox Code Playgroud)

保存脚本并使用包名作为参数运行它,例如:

python versions.py django
Run Code Online (Sandbox Code Playgroud)
3.0a1
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2
2.2rc1
...
Run Code Online (Sandbox Code Playgroud)

  • 这个对我来说效果最好 - 它生成有效版本号的排序列表。 (2认同)

小智 17

你可以使用yolk3k包而不是蛋黄.yolk3k是原始蛋黄的一个分叉,它支持python2和3.

https://github.com/myint/yolk

pip install yolk3k
Run Code Online (Sandbox Code Playgroud)

  • 这很容易知道,因为蛋黄在 python 3.x 下不起作用 (2认同)
  • yolk3k 只为我返回已安装的版本:`yolk -V attest` `Attest 0.5.3` (2认同)
  • yolk3k似乎只返回最新版本? (2认同)

Tim*_*bov 16

我想出了简单的bash脚本.感谢jq的作者.

#!/bin/bash
set -e

PACKAGE_JSON_URL="https://pypi.org/pypi/${1}/json"

curl -s "$PACKAGE_JSON_URL" | jq  -r '.releases | keys | .[]' | sort -V
Run Code Online (Sandbox Code Playgroud)

更新:按版本号添加排序.

  • 我无法让“curl”工作,可能是因为证书错误。`wget --no-check-certificate` 可以工作,但即使是 `curl -k --insecure` 也不会产生任何结果。我通过“wget”收到的警告显示“错误:证书通用名称\`www.python.org”与请求的主机名\“pypi.python.org”不匹配。 (2认同)
  • Oneliner 格式:`PACKAGE=&lt;here-goes-the-package&gt;; 卷曲-L -s“https://pypi.org/pypi/${PACKAGE}/json”| jq -r '.releases | 按键 | .[]'| 排序-Vr | 头-n 10` (2认同)

Rei*_*cke 14

看了pip的代码一段时间后,看起来负责定位包的代码可以在PackageFinder类中找到pip.index.它的方法find_requirement查找a的版本InstallRequirement,但不幸的是只返回最新版本.

下面的代码几乎是原始函数的1:1副本,第114行中的返回更改为返回所有版本.

该脚本期望一个包名称作为第一个且唯一的参数,并返回所有版本.

http://pastebin.com/axzdUQhZ

我不能保证正确性,因为我不熟悉pip的代码.但希望这会有所帮助.

样本输出

python test.py pip
Run Code Online (Sandbox Code Playgroud)

代码:

Versions of pip
0.8.2
0.8.1
0.8
0.7.2
0.7.1
0.7
0.6.3
0.6.2
0.6.1
0.6
0.5.1
0.5
0.4
0.3.1
0.3
0.2.1
0.2 dev
Run Code Online (Sandbox Code Playgroud)

  • [文档](https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program) 中明确不鼓励这种用法:“***您不得使用 pip 的内部 API这样***” (2认同)

Con*_*ich 9

您可以尝试安装确实存在的软件包版本。然后 pip 将列出可用版本

pip install hell==99999
ERROR: Could not find a version that satisfies the requirement hell==99999
(from versions: 0.1.0, 0.2.0, 0.2.1, 0.2.2, 0.2.3, 0.2.4, 0.3.0,
0.3.1, 0.3.2, 0.3.3, 0.3.4, 0.4.0, 0.4.1)
ERROR: No matching distribution found for hell==99999
Run Code Online (Sandbox Code Playgroud)


lak*_*tak 9

pip-versions包做得非常出色:

$ pip3 install pip-versions

$ pip-versions latest rsyncy
0.0.4
    
$ pip-versions list rsyncy
0.0.1
0.0.2
0.0.3
0.0.4
Run Code Online (Sandbox Code Playgroud)

这甚至可以在 Nexus (sonatype) 代理后面工作!


m0s*_*she 8

https://pypi.python.org/pypi/Django/ - 适用于其维护者选择显示所有软件包的软件包 https://pypi.python.org/simple/pip/ - 无论如何应该做的伎俩(列出所有链接)


Vin*_*ini 7

更新

也许不再需要该解决方案,请查看对此答案的评论。

原答案

对于 20.03 以上的 pip 版本,您可以使用旧的求解器来获取所有可用版本:

$ pip install  --use-deprecated=legacy-resolver pylibmc==
ERROR: Could not find a version that satisfies the requirement pylibmc== (from    
versions: 0.2, 0.3, 0.4, 0.5, 0.5.1, 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.6, 0.6.1,
0.7, 0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.8, 0.8.1, 0.8.2, 0.9, 0.9.1, 0.9.2, 1.0a0, 
1.0b0, 1.0, 1.1, 1.1.1, 1.2.0, 1.2.1, 1.2.2, 1.2.3, 1.3.0, 1.4.0, 1.4.1, 
1.4.2, 1.4.3, 1.5.0, 1.5.1, 1.5.2, 1.5.100.dev0, 1.6.0, 1.6.1)

ERROR: No matching distribution found for pylibmc==
Run Code Online (Sandbox Code Playgroud)

  • pip &gt;= 21.1 中不再需要它(请参阅[问题](https://github.com/pypa/pip/issues/9139)),不妨现在删除此答案。 (2认同)

gra*_*dma 6

这对我在OSX上有效:

pip install docker-compose== 2>&1 \
| grep -oE '(\(.*\))' \
| awk -F:\  '{print$NF}' \
| sed -E 's/( |\))//g' \
| tr ',' '\n'
Run Code Online (Sandbox Code Playgroud)

它每行返回一个列表:

1.1.0rc1
1.1.0rc2
1.1.0
1.2.0rc1
1.2.0rc2
1.2.0rc3
1.2.0rc4
1.2.0
1.3.0rc1
1.3.0rc2
1.3.0rc3
1.3.0
1.3.1
1.3.2
1.3.3
1.4.0rc1
1.4.0rc2
1.4.0rc3
1.4.0
1.4.1
1.4.2
1.5.0rc1
1.5.0rc2
1.5.0rc3
1.5.0
1.5.1
1.5.2
1.6.0rc1
1.6.0
1.6.1
1.6.2
1.7.0rc1
1.7.0rc2
1.7.0
1.7.1
1.8.0rc1
1.8.0rc2
1.8.0
1.8.1
1.9.0rc1
1.9.0rc2
1.9.0rc3
1.9.0rc4
1.9.0
1.10.0rc1
1.10.0rc2
1.10.0
Run Code Online (Sandbox Code Playgroud)

或获取可用的最新版本:

pip install docker-compose== 2>&1 \
| grep -oE '(\(.*\))' \
| awk -F:\  '{print$NF}' \
| sed -E 's/( |\))//g' \
| tr ',' '\n' \
| gsort -r -V \
| head -1
Run Code Online (Sandbox Code Playgroud)
1.10.0rc2
Run Code Online (Sandbox Code Playgroud)

请记住gsort,必须安装(在OSX上)以解析版本。您可以使用安装brew install coreutils

  • @BrianLeach smh...它与过滤后在脚本中使用的方法相同... (2认同)
  • 对我来说,在 cygwin / bash 中工作,对于第二个解决方案,使用排序,而不是 cygwin 中的 gsort 。 (2认同)

wim*_*wim 6

我的项目luddite有这个功能。

用法示例:

>>> import luddite
>>> luddite.get_versions_pypi("python-dateutil")
('0.1', '0.3', '0.4', '0.5', '1.0', '1.1', '1.2', '1.4', '1.4.1', '1.5', '2.0', '2.1', '2.2', '2.3', '2.4.0', '2.4.1', '2.4.2', '2.5.0', '2.5.1', '2.5.2', '2.5.3', '2.6.0', '2.6.1', '2.7.0', '2.7.1', '2.7.2', '2.7.3', '2.7.4', '2.7.5', '2.8.0')
Run Code Online (Sandbox Code Playgroud)

它通过查询https://pypi.org/的 json API 列出可用包的所有版本

  • @user228395 我不会将其称为“包装”,因为该答案使用 bash、curl 和 jq - 而 luddite 仅使用 Python 标准库(urllib)。但 Stolbov 的解决方案确实在 https://pypi.org 上使用相同的端点。请问您投反对票的原因是什么? (3认同)
  • @user228395我认为这很明显,但它列出了可用软件包的所有版本,这正是问题标题所问的内容。编辑 - 更好? (2认同)
  • 如果您点击项目详细信息页面的链接,您可以看到该项目的主要功能是检查 [`requirements.txt`](https://user-images.githubusercontent.com/6615374/43939075-feec4530-9c2c- 11e8-9770-6f7f762c72e4.png) 过时软件包的文件。它不仅仅是几行代码。为了检查“requirements.txt”文件,您需要列出所有包版本的功能。这部分是有意解耦的,并且是 Luddite 公共 API 的一部分。它是 Apache License 2.0 的源代码,我认为称其为“黑盒”软件包不太公平。 (2认同)

Tej*_*ade 6

我通常会跑pip install packagename==somerandomstring。这将返回错误说明Could not find a version that satisfies the requirement packagename==somerandomstring,除了该错误,pip 还将列出服务器上的可用版本。

例如

$ pip install flask==aksjflashd
Collecting flask==aksjflashd
  Could not find a version that satisfies the requirement flask==aksjflashd 
(from versions: 0.1, 0.2, 0.3, 0.3.1, 0.4, 0.5, 0.5.1, 0.5.2, 0.6, 0.6.1, 0.7, 0.7.1, 0.7.2, 0.8, 0.8.1, 0.9, 0.10, 0.10.1, 0.11, 0.11.1, 0.12, 0.12.1, 
0.12.2, 0.12.3, 0.12.4, 0.12.5, 1.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.1.0, 1.1.1, 1.1.2)
No matching distribution found for flask==aksjflashd
$
Run Code Online (Sandbox Code Playgroud)

如果像 'aksjflashd' 这样的随机字符串被证明是实际的软件包版本,那你就非常不走运了!

当然,你也可以使用这个技巧pip download


Cha*_*lie 5

替代解决方案是使用 Warehouse API:

https://warehouse.readthedocs.io/api-reference/json/#release

以烧瓶为例:

import requests
r = requests.get("https://pypi.org/pypi/Flask/json")
print(r.json()['releases'].keys())
Run Code Online (Sandbox Code Playgroud)

将打印:

dict_keys(['0.1', '0.10', '0.10.1', '0.11', '0.11.1', '0.12', '0.12.1', '0.12.2', '0.12.3', '0.12.4', '0.2', '0.3', '0.3.1', '0.4', '0.5', '0.5.1', '0.5.2', '0.6', '0.6.1', '0.7', '0.7.1', '0.7.2', '0.8', '0.8.1', '0.9', '1.0', '1.0.1', '1.0.2'])
Run Code Online (Sandbox Code Playgroud)