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

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


当前回答

使用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方法。

其他回答

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

对于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可以是任何不是有效版本号的字符串。

更新:

也许解决方案不再需要了,检查这个答案的注释。

原来的答案

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

适用于最新的pip版本,不需要额外的工具:

pip install pylibmc== -v 2>/dev/null | awk '/Found link/ {print $NF}' | uniq

我没有任何蛋黄,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
...