如何使用 pip 列出所有可用的软件包版本?
- 2025-02-08 08:52:00
- admin 原创
- 65
问题描述:
给定一个可以使用pip安装的 Python 包的名称,有没有办法找出 pip 可以安装的所有可能版本的列表?现在只能反复试验了。
我正在尝试安装第三方库的版本,但最新版本太新了,做了向后不兼容的更改。所以我想以某种方式获得 pip 知道的所有版本的列表,以便我可以测试它们。
解决方案 1:
对于pip >= 21.2使用:
pip index versions pylibmc
请注意,此命令是实验性的,将来可能会发生变化!
以下方法与2024-06-21 发布的pip 24.1不兼容。
对于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
其中可以是任何非有效版本号的blork
字符串。
解决方案 2:
(更新:截至 2020 年 3 月,许多人报告说通过 安装的 yolkpip install yolk3k
只返回最新版本。Chris 的回答似乎获得了最多的赞成票,并且对我有用)
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
是原版的一个分支,yolk
原版于2012 年停止开发。虽然yolk
不再维护(如下方评论所示),但yolk3k
似乎支持 Python 3。
注意:我没有参与 yolk3k 的开发。如果某些功能似乎无法正常工作,在这里发表评论应该没什么用。请使用yolk3k 问题跟踪器,并考虑提交修复程序(如果可能)。
解决方案 3:
你不需要第三方包来获取此信息。pypi 为以下所有包提供了简单的 JSON 提要
https://pypi.org/pypi/{PKG_NAME}/json
下面是仅使用获取所有版本的标准库的一些 Python 代码。
import requests
from distutils.version import LooseVersion
def versions(package_name, limit_releases=10):
url = f"https://pypi.org/pypi/{package_name}/json"
data = requests.get(url).json()
versions = list(data["releases"].keys())
versions.sort(key=LooseVersion, reverse=True)
return versions[:limit_releases]
print("
".join(versions("typeguard")))
该代码打印(截至 2023 年 7 月 21 日):
4.0.0rc6
4.0.0rc5
4.0.0rc4
4.0.0rc3
4.0.0rc2
4.0.0rc1
4.0.0
3.0.2
3.0.1
3.0.0rc2
解决方案 4:
更新:
截至 2017 年 9 月,此方法不再有效:--no-install
已在 pip 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
如果不想安装任何软件包,请使用以下解决方案之一:
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
或者
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
使用 pip 1.0 测试
root@node7:~# pip --version
pip 1.0 from /usr/lib/python2.7/dist-packages (python 2.7)
解决方案 5:
我想出了一个非常简单的 bash 脚本。感谢jq的作者。
#!/bin/bash
set -e
PACKAGE_JSON_URL="https://pypi.org/pypi/${1}/json"
curl -L -s "$PACKAGE_JSON_URL" \n | jq -r '.releases \n | keys | .[]' \n | sort -V
更新:
添加按版本号排序。
添加
-L
以跟随重定向。
解决方案 6:
您可以使用这个小型 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='
')
保存脚本并以包名称作为参数运行它,例如:
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
...
解决方案 7:
查看了一段时间 pip 的代码后,似乎负责定位包的代码可以在PackageFinder
中的类中找到pip.index
。它的方法find_requirement
查找 的版本InstallRequirement
,但不幸的是只返回最新版本。
下面的代码几乎是原始函数的 1:1 复制,将第 114 行的返回改为返回所有版本。
该脚本需要一个包名称作为第一个也是唯一的参数并返回所有版本。
我无法保证正确性,因为我不熟悉 pip 的代码。但希望这能有所帮助。
示例输出
python test.py pip
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
代码:
import posixpath
import pkg_resources
import sys
from pip.download import url_to_path
from pip.exceptions import DistributionNotFound
from pip.index import PackageFinder, Link
from pip.log import logger
from pip.req import InstallRequirement
from pip.util import Inf
class MyPackageFinder(PackageFinder):
def find_requirement(self, req, upgrade):
url_name = req.url_name
# Only check main index if index URL is given:
main_index_url = None
if self.index_urls:
# Check that we have the url_name correctly spelled:
main_index_url = Link(posixpath.join(self.index_urls[0], url_name))
# This will also cache the page, so it's okay that we get it again later:
page = self._get_page(main_index_url, req)
if page is None:
url_name = self._find_url_name(Link(self.index_urls[0]), url_name, req) or req.url_name
# Combine index URLs with mirror URLs here to allow
# adding more index URLs from requirements files
all_index_urls = self.index_urls + self.mirror_urls
def mkurl_pypi_url(url):
loc = posixpath.join(url, url_name)
# For maximum compatibility with easy_install, ensure the path
# ends in a trailing slash. Although this isn't in the spec
# (and PyPI can handle it without the slash) some other index
# implementations might break if they relied on easy_install's behavior.
if not loc.endswith('/'):
loc = loc + '/'
return loc
if url_name is not None:
locations = [
mkurl_pypi_url(url)
for url in all_index_urls] + self.find_links
else:
locations = list(self.find_links)
locations.extend(self.dependency_links)
for version in req.absolute_versions:
if url_name is not None and main_index_url is not None:
locations = [
posixpath.join(main_index_url.url, version)] + locations
file_locations, url_locations = self._sort_locations(locations)
locations = [Link(url) for url in url_locations]
logger.debug('URLs to search for versions for %s:' % req)
for location in locations:
logger.debug('* %s' % location)
found_versions = []
found_versions.extend(
self._package_versions(
[Link(url, '-f') for url in self.find_links], req.name.lower()))
page_versions = []
for page in self._get_pages(locations, req):
logger.debug('Analyzing links from page %s' % page.url)
logger.indent += 2
try:
page_versions.extend(self._package_versions(page.links, req.name.lower()))
finally:
logger.indent -= 2
dependency_versions = list(self._package_versions(
[Link(url) for url in self.dependency_links], req.name.lower()))
if dependency_versions:
logger.info('dependency_links found: %s' % ', '.join([link.url for parsed, link, version in dependency_versions]))
file_versions = list(self._package_versions(
[Link(url) for url in file_locations], req.name.lower()))
if not found_versions and not page_versions and not dependency_versions and not file_versions:
logger.fatal('Could not find any downloads that satisfy the requirement %s' % req)
raise DistributionNotFound('No distributions at all found for %s' % req)
if req.satisfied_by is not None:
found_versions.append((req.satisfied_by.parsed_version, Inf, req.satisfied_by.version))
if file_versions:
file_versions.sort(reverse=True)
logger.info('Local files found: %s' % ', '.join([url_to_path(link.url) for parsed, link, version in file_versions]))
found_versions = file_versions + found_versions
all_versions = found_versions + page_versions + dependency_versions
applicable_versions = []
for (parsed_version, link, version) in all_versions:
if version not in req.req:
logger.info("Ignoring link %s, version %s doesn't match %s"
% (link, version, ','.join([''.join(s) for s in req.req.specs])))
continue
applicable_versions.append((link, version))
applicable_versions = sorted(applicable_versions, key=lambda v: pkg_resources.parse_version(v[1]), reverse=True)
existing_applicable = bool([link for link, version in applicable_versions if link is Inf])
if not upgrade and existing_applicable:
if applicable_versions[0][1] is Inf:
logger.info('Existing installed version (%s) is most up-to-date and satisfies requirement'
% req.satisfied_by.version)
else:
logger.info('Existing installed version (%s) satisfies requirement (most up-to-date version is %s)'
% (req.satisfied_by.version, applicable_versions[0][1]))
return None
if not applicable_versions:
logger.fatal('Could not find a version that satisfies the requirement %s (from versions: %s)'
% (req, ', '.join([version for parsed_version, link, version in found_versions])))
raise DistributionNotFound('No distributions matching the version for %s' % req)
if applicable_versions[0][0] is Inf:
# We have an existing version, and its the best version
logger.info('Installed version (%s) is most up-to-date (past versions: %s)'
% (req.satisfied_by.version, ', '.join([version for link, version in applicable_versions[1:]]) or 'none'))
return None
if len(applicable_versions) > 1:
logger.info('Using version %s (newest of versions: %s)' %
(applicable_versions[0][1], ', '.join([version for link, version in applicable_versions])))
return applicable_versions
if __name__ == '__main__':
req = InstallRequirement.from_line(sys.argv[1], None)
finder = MyPackageFinder([], ['http://pypi.python.org/simple/'])
versions = finder.find_requirement(req, False)
print 'Versions of %s' % sys.argv[1]
for v in versions:
print v[1]
解决方案 8:
您可以使用 yolk3k 包来代替 yolk。yolk3k 是从原始 yolk 分支出来的,它同时支持 python2 和 3。
pip install yolk3k
解决方案 9:
我的项目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')
它通过查询https://pypi.org/的JSON API列出可用包的所有版本
解决方案 10:
更新:
也许该解决方案不再需要,请查看该答案的评论。
原始答案
对于 pip 版本高于 20.03,您可以使用旧的求解器来恢复所有可用版本:
$ 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==
解决方案 11:
这在 OSX 上对我有用:
pip install docker-compose== 2>&1 \n| grep -oE '((.*))' \n| awk -F: '{print$NF}' \n| sed -E 's/( |))//g' \n| tr ',' '
'
它每行返回一个列表:
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
或者获取最新版本:
pip install docker-compose== 2>&1 \n| grep -oE '((.*))' \n| awk -F: '{print$NF}' \n| sed -E 's/( |))//g' \n| tr ',' '
' \n| gsort -r -V \n| head -1
1.10.0rc2
请记住,gsort
必须安装(在 OSX 上)才能解析版本。您可以使用以下方式安装它brew install coreutils
解决方案 12:
我通常运行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
$
如果像“aksjflashd”这样的随机字符串结果是实际的软件包版本,那么您一定非常不走运!
当然,你pip download
也可以使用这个技巧。
解决方案 13:
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
这甚至可以在 Nexus(sonatype)代理后面工作!
解决方案 14:
替代解决方案是使用 Warehouse 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'])
解决方案 15:
这是我对列表进行排序的答案(对于那些使用不可用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
解决方案 16:
bash
仅依赖于python
自身(我假设在问题的上下文中它应该被安装)和curl
或之一的简单脚本wget
。它假设您已经setuptools
安装了软件包以对版本进行排序(几乎总是安装)。它不依赖于外部依赖项,例如:
jq
可能不存在;grep
`awk`在 Linux 和 macOS 上的表现可能会有所不同。
curl --silent --location https://pypi.org/pypi/requests/json | python -c "import sys, json, pkg_resources; releases = json.load(sys.stdin)['releases']; print(' '.join(sorted(releases, key=pkg_resources.parse_version)))"
稍长一些的版本,带有注释。
将包名称放入变量中:
PACKAGE=requests
获取版本(使用curl
):
VERSIONS=$(curl --silent --location https://pypi.org/pypi/$PACKAGE/json | python -c "import sys, json, pkg_resources; releases = json.load(sys.stdin)['releases']; print(' '.join(sorted(releases, key=pkg_resources.parse_version)))")
获取版本(使用wget
):
VERSIONS=$(wget -qO- https://pypi.org/pypi/$PACKAGE/json | python -c "import sys, json, pkg_resources; releases = json.load(sys.stdin)['releases']; print(' '.join(sorted(releases, key=pkg_resources.parse_version)))")
打印排序后的版本:
echo $VERSIONS
解决方案 17:
适用于最新的 pip 版本,无需额外的工具:
pip install pylibmc== -v 2>/dev/null | awk '/Found link/ {print $NF}' | uniq
解决方案 18:
要查找所有可用(甚至不兼容)的版本,请使用-vv
标志pip >= 21.x
。
pip install sklearn== --dry-run -vv
不兼容的版本将在日志中列出,如下所示:
Skipping link: none of the wheel's tags (cp27-cp27m-win32) are compatible
解决方案 19:
我用起来没什么效果yolk
,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("
".join(versions("gunicorn")))
19.1.1
19.1.0
19.0.0
18.0
17.5
0.17.4
0.17.3
...
解决方案 20:
要获取 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'
解决方案 21:
这是 Limmy+EricChiang 解决方案的 Py3.9+ 版本。
import json
import urllib.request
from distutils.version import StrictVersion
# print PyPI versions of package
def versions(package_name):
url = "https://pypi.org/pypi/%s/json" % (package_name,)
data = json.load(urllib.request.urlopen(url))
versions = list(data["releases"])
sortfunc = lambda x: StrictVersion(x.replace('rc', 'b').translate(str.maketrans('cdefghijklmn', 'bbbbbbbbbbbb')))
versions.sort(key=sortfunc)
return versions
解决方案 22:
目前获取最新依赖版本的最简单方法是使用 curl 和 jq:
curl -sL https://pypi.org/pypi/${PACKAGE}/json | jq -r .info.version
解决方案 23:
我编写了一个函数来解决这个问题。希望它能有所帮助。
import re
from subprocess import CompletedProcess, run
from typing import Callable
def get_available_versions(
package: str,
index_url: str | None = None,
predicate: Callable[[str], bool] | None = None,
) -> list[str]:
"""Get a sorted list of available versions for a given package from pip."""
def default_predicate(_: str) -> bool:
return True
run_args = ["pip", "install", f"{package}=="]
if index_url:
run_args += ["--index-url", index_url]
predicate = predicate or default_predicate
cp: CompletedProcess = run(
run_args,
capture_output=True,
text=True,
)
err = f"ERROR: Could not find a version that satisfies the requirement {package}=="
if err not in cp.stderr:
raise Exception(f"Expected stderr to contain '{err}'.")
match = re.search(r"(from versions: (.+?))", cp.stderr)
if match:
return sorted([el for el in match.group(1).split(", ") if predicate(el)])
else:
return []
if __name__ == "__main__":
print(get_available_versions("requests"))
解决方案 24:
我的看法是结合一些已发布的答案,并进行了一些修改,以便更容易在正在运行的 Python 环境中使用它们。
这个想法是提供一个全新的命令(仿照 install 命令),为您提供一个要使用的包查找器实例。优点是它可以与 pip 支持的任何索引配合使用,并读取您的本地 pip 配置文件,因此您可以像使用普通 pip install 一样获得正确的结果。
我尝试让它与 pip v 9.x 和 10.x 兼容,但只在 9.x 上尝试过
https://gist.github.com/kaos/68511bd013fcdebe766c981f50b473d4
#!/usr/bin/env python
# When you want a easy way to get at all (or the latest) version of a certain python package from a PyPi index.
import sys
import logging
try:
from pip._internal import cmdoptions, main
from pip._internal.commands import commands_dict
from pip._internal.basecommand import RequirementCommand
except ImportError:
from pip import cmdoptions, main
from pip.commands import commands_dict
from pip.basecommand import RequirementCommand
from pip._vendor.packaging.version import parse as parse_version
logger = logging.getLogger('pip')
class ListPkgVersionsCommand(RequirementCommand):
"""
List all available versions for a given package from:
- PyPI (and other indexes) using requirement specifiers.
- VCS project urls.
- Local project directories.
- Local or remote source archives.
"""
name = "list-pkg-versions"
usage = """
%prog [options] <requirement specifier> [package-index-options] ...
%prog [options] [-e] <vcs project url> ...
%prog [options] [-e] <local project path> ...
%prog [options] <archive url/path> ..."""
summary = 'List package versions.'
def __init__(self, *args, **kw):
super(ListPkgVersionsCommand, self).__init__(*args, **kw)
cmd_opts = self.cmd_opts
cmd_opts.add_option(cmdoptions.install_options())
cmd_opts.add_option(cmdoptions.global_options())
cmd_opts.add_option(cmdoptions.use_wheel())
cmd_opts.add_option(cmdoptions.no_use_wheel())
cmd_opts.add_option(cmdoptions.no_binary())
cmd_opts.add_option(cmdoptions.only_binary())
cmd_opts.add_option(cmdoptions.pre())
cmd_opts.add_option(cmdoptions.require_hashes())
index_opts = cmdoptions.make_option_group(
cmdoptions.index_group,
self.parser,
)
self.parser.insert_option_group(0, index_opts)
self.parser.insert_option_group(0, cmd_opts)
def run(self, options, args):
cmdoptions.resolve_wheel_no_use_binary(options)
cmdoptions.check_install_build_global(options)
with self._build_session(options) as session:
finder = self._build_package_finder(options, session)
# do what you please with the finder object here... ;)
for pkg in args:
logger.info(
'%s: %s', pkg,
', '.join(
sorted(
set(str(c.version) for c in finder.find_all_candidates(pkg)),
key=parse_version,
)
)
)
commands_dict[ListPkgVersionsCommand.name] = ListPkgVersionsCommand
if __name__ == '__main__':
sys.exit(main())
示例输出
./list-pkg-versions.py list-pkg-versions pika django
pika: 0.5, 0.5.1, 0.5.2, 0.9.1a0, 0.9.2a0, 0.9.3, 0.9.4, 0.9.5, 0.9.6, 0.9.7, 0.9.8, 0.9.9, 0.9.10, 0.9.11, 0.9.12, 0.9.13, 0.9.14, 0.10.0b1, 0.10.0b2, 0.10.0, 0.11.0b1, 0.11.0, 0.11.1, 0.11.2, 0.12.0b2
django: 1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.4.8, 1.4.9, 1.4.10, 1.4.11, 1.4.12, 1.4.13, 1.4.14, 1.4.15, 1.4.16, 1.4.17, 1.4.18, 1.4.19, 1.4.20, 1.4.21, 1.4.22, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.5.4, 1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11, 1.5.12, 1.6, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.6.5, 1.6.6, 1.6.7, 1.6.8, 1.6.9, 1.6.10, 1.6.11, 1.7, 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 1.7.9, 1.7.10, 1.7.11, 1.8a1, 1.8b1, 1.8b2, 1.8rc1, 1.8, 1.8.1, 1.8.2, 1.8.3, 1.8.4, 1.8.5, 1.8.6, 1.8.7, 1.8.8, 1.8.9, 1.8.10, 1.8.11, 1.8.12, 1.8.13, 1.8.14, 1.8.15, 1.8.16, 1.8.17, 1.8.18, 1.8.19, 1.9a1, 1.9b1, 1.9rc1, 1.9rc2, 1.9, 1.9.1, 1.9.2, 1.9.3, 1.9.4, 1.9.5, 1.9.6, 1.9.7, 1.9.8, 1.9.9, 1.9.10, 1.9.11, 1.9.12, 1.9.13, 1.10a1, 1.10b1, 1.10rc1, 1.10, 1.10.1, 1.10.2, 1.10.3, 1.10.4, 1.10.5, 1.10.6, 1.10.7, 1.10.8, 1.11a1, 1.11b1, 1.11rc1, 1.11, 1.11.1, 1.11.2, 1.11.3, 1.11.4, 1.11.5, 1.11.6, 1.11.7, 1.11.8, 1.11.9, 1.11.10, 1.11.11, 1.11.12, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4
解决方案 25:
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
解决方案 26:
为Chris 的答案提供一种编程方法,使用pip install <package_name>==
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 方法。
解决方案 27:
据我从这个和这个理解,该releases
密钥将在不久的将来被丢弃,因此使用的解决方案GET "https://pypi.python.org/pypi/{package_name}/json"
将不再起作用。
解决方案 28:
My take (based on @eric chiang answer):
def versions(package_name, limit_releases):
url = f'https://pypi.org/pypi/{package_name}/json'
data = requests.get(url).json()
versions = list(data['releases'].keys())
if(limit_releases):
return versions[:5]
return versions
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('package_name', help='package name', type=str)
parser.add_argument('-l', help='last releases to show', dest='limit_releases', action='store_true')
args = parser.parse_args()
print('
'.join(versions(args.package_name, args.limit_releases)))
解决方案 29:
在更新版本中pip
以下解决方案不起作用:
pip install django==
pip install django==anyrandomstring
不要使用这些,而是在 后使用任意随机数==
,如下所示:
pip install django==121312
为了纠正你,终端会显示所有可用的版本。你可以选择适合你的版本。
解决方案 30:
如果你想安装一个名为的包pkg
,请尝试:
pip install pkg==0.0
这适用于任何 pip 版本。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)