给定可以与pip一起安装的Python包的名称,是否有任何方法可以找到pip可以安装的所有可能版本的列表?现在是反复试验。

我正在尝试为第三方库安装一个版本,但最新版本太新了,有向后不兼容的更改。因此,我希望以某种方式获得pip所知道的所有版本的列表,以便我可以测试它们。


当前回答

另一种解决方案是使用仓库api:

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

例如,对于Flask:

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

将打印:

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'])

其他回答

https://pypi.python.org/pypi/Django/—适用于那些维护者选择显示所有包的包 https://pypi.python.org/simple/pip/ -无论如何都应该做到(列出所有链接)

我没有任何蛋黄,yolk3k或pip install -v的运气,但我最终使用了这个(从eric chiang的答案改编到Python 3):

import json
import requests
from distutils.version import StrictVersion

def versions(package_name):
    url = "https://pypi.python.org/pypi/{}/json".format(package_name)
    data = requests.get(url).json()
    return sorted(list(data["releases"].keys()), key=StrictVersion, reverse=True)

>>> print("\n".join(versions("gunicorn")))
19.1.1
19.1.0
19.0.0
18.0
17.5
0.17.4
0.17.3
...

对于pip >= 21.2使用:

pip index versions pylibmc

注意,这个命令是实验性的,将来可能会改变!

对于pip >= 21.1使用:

pip install pylibmc==

对于pip >= 20.3使用:

pip install --use-deprecated=legacy-resolver pylibmc==

对于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==

可用的版本将在不实际下载或安装任何软件包的情况下打印出来。

对于pip < 9.0使用:

pip install pylibmc==blork

其中,block可以是任何不是有效版本号的字符串。

您可以使用这个小型Python 3脚本(仅使用标准库模块)使用JSON API从PyPI获取包的可用版本列表,并按时间倒序打印它们。与这里发布的其他Python解决方案不同,这不会破坏松散版本,如django的2.2rc1或uwsgi的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')

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

python versions.py django
3.0a1
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2
2.2rc1
...
pypi-has() { set -o pipefail; curl -sfL https://pypi.org/pypi/$1/json | jq -e --arg v $2 'any( .releases | keys[]; . == $v )'; }

用法:

$ pypi-has django 4.0x ; echo $?
false
1

$ pypi-has djangos 4.0x ; echo $?
22

$ pypi-has djangos 4.0 ; echo $?
22

$ pypi-has django 4.0 ; echo $?
true
0