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

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


当前回答

以下是我在jq中对列表进行排序的答案(对于那些使用sort -V不可用的系统的人):

$ pythonPackage=certifi
$ curl -Ls https://pypi.org/pypi/$pythonPackage/json | jq -r '.releases | keys_unsorted | sort_by( split(".") | map(tonumber) )'
  ............. 
  "2019.3.9",
  "2019.6.16",
  "2019.9.11",
  "2019.11.28",
  "2020.4.5",
  "2020.4.5.1",
  "2020.4.5.2",
  "2020.6.20",
  "2020.11.8"
]

获取包的最新版本号:

$ curl -Ls https://pypi.org/pypi/$pythonPackage/json | jq -r '.releases | keys_unsorted | sort_by( split(".") | map(tonumber) )[-1]'
2020.11.8

或者更快一点:

$ curl -Ls https://pypi.org/pypi/$pythonPackage/json | jq -r '.releases | keys_unsorted | max_by( split(".") | map(tonumber) )'
2020.11.8

或者更简单一点:):

$ curl -Ls https://pypi.org/pypi/$pythonPackage/json | jq -r .info.version
2020.11.8

其他回答

要获取GitLab私有包的最新版本,可以使用以下方法。

pip index versions package-name --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.com/api/v4/projects/<project-id>/packages/pypi/simple/ | grep  'LATEST:' | sed -E 's/LATEST:| //g'

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

https://pypi.org/pypi/{PKG_NAME}/json

下面是一些仅使用标准库的Python代码,该标准库可以获得所有版本。

import json
import urllib2
from distutils.version import StrictVersion

def versions(package_name):
    url = "https://pypi.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"))

该代码打印(截至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

(更新:截至2020年3月,许多人报告说,通过pip install yolk3k安装的蛋黄只返回最新版本。克里斯的回答似乎获得了最多的赞,对我来说很有用)

在pastebin中的脚本可以工作。但是,如果您使用多个环境/主机,这就不太方便了,因为每次都必须复制/创建它。

更好的全面解决方案是使用yolk3k,它可以与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

Yolk3k是原蛋黄的一个分支,于2012年停止开发。虽然不再维护蛋黄(如下面的评论所示),但蛋黄3k似乎是并支持Python 3。

注意:我没有参与蛋黄3k的形成。如果有些东西似乎没有像它应该的那样工作,在这里留下评论应该不会有太大的区别。如果可能的话,请使用yolk3k问题跟踪器,并考虑提交修复程序。

使用pip install <package_name>==为Chris的答案提供编程方法

import re
import subprocess
from packaging.version import VERSION_PATTERN as _VRESION_PATTERN

VERSION_PATTERN = re.compile(_VRESION_PATTERN , re.VERBOSE | re.IGNORECASE)


def get_available_versions(package_name):
    process = subprocess.run(['pip', 'install', f'{package_name}=='], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
    versions = []
    for line in process.stderr.decode('utf-8').splitlines():
        if 'Could not find a version that satisfies the requirement' in line:
            for match in VERSION_PATTERN.finditer(line.split('from versions:')[1]):
                versions.append(match.group(0))
    return versions

它可以像这样使用

>>> get_available_versions('tensorflow')
['2.2.0rc1', '2.2.0rc2', '2.2.0rc3', '2.2.0rc4', '2.2.0', '2.2.1', '2.2.2', '2.2.3', '2.3.0rc0', '2.3.0rc1', '2.3.0rc2', '2.3.0', '2.3.1', '2.3.2', '2.3.3', '2.3.4', '2.4.0rc0', '2.4.0rc1', '2.4.0rc2', '2.4.0rc3', '2.4.0rc4', '2.4.0', '2.4.1', '2.4.2', '2.4.3', '2.4.4', '2.5.0rc0', '2.5.0rc1', '2.5.0rc2', '2.5.0rc3', '2.5.0', '2.5.1', '2.5.2', '2.5.3', '2.6.0rc0', '2.6.0rc1', '2.6.0rc2', '2.6.0', '2.6.1', '2.6.2', '2.6.3', '2.7.0rc0', '2.7.0rc1', '2.7.0', '2.7.1', '2.8.0rc0', '2.8.0rc1', '2.8.0']

并返回一个版本列表。

注意:它似乎提供兼容版本,而不是所有版本。要获得完整的列表,请使用Eric的json方法。

要找到所有可用的(甚至不兼容的)版本,使用pip >= 21.x的-vv标志。

pip install sklearn== --dry-run -vv

不兼容的版本将在日志中如下所示:

Skipping link: none of the wheel's tags (cp27-cp27m-win32) are compatible