Python和pip,列出';有空吗?

Python和pip,列出';有空吗?,python,pip,Python,Pip,给定可以安装的Python包的名称,有没有办法找到pip可以安装的所有可能版本的列表?现在是反复试验 我正在尝试为第三方库安装一个版本,但最新版本太新,有向后不兼容的更改。因此,我希望有一个pip知道的所有版本的列表,以便测试它们。在查看了pip的代码一段时间后,似乎可以在pip.index中的PackageFinder类中找到负责定位包的代码。它的方法find_requirement查找InstallRequirement的版本,但不幸的是只返回最新版本 下面的代码几乎是原始函数的1:1副本,

给定可以安装的Python包的名称,有没有办法找到pip可以安装的所有可能版本的列表?现在是反复试验


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

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

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

脚本需要一个包名作为第一个也是唯一的参数,并返回所有版本

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

样本输出

python test.py pip
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开发
守则:

导入posixpath
导入pkg_资源
导入系统
从pip.download导入url\u到路径
从pip.exceptions导入DistributionNotFound
从pip.index导入PackageFinder,链接
从pip.log导入记录器
从pip.req导入安装要求
从pip.util导入Inf
类别MyPackageFinder(PackageFinder):
def查找需求(自我、请求、升级):
url\u name=req.url\u name
#仅在给定索引URL时检查主索引:
主索引url=无
如果self.index\u URL:
#检查url\u名称是否拼写正确:
main_index_url=Link(posixpath.join(self.index_url[0],url\u name))
#这也会缓存页面,因此我们可以稍后再获取它:
页面=自我获取页面(主索引url,请求)
如果页面为“无”:
url\u name=self.\u查找\u url\u名称(链接(self.index\u url[0])、url\u名称、请求)或req.url\u名称
#在此处将索引URL与镜像URL组合以允许
#从需求文件添加更多索引URL
所有索引URL=self.index\uURL+self.mirror\uURL
def mkurl_pypi_url(url):
loc=posixpath.join(url,url\u名称)
#为了最大限度地兼容easy_install,请确保路径
#以尾部斜杠结束。虽然这不在规范中
#(PyPI可以处理它而不需要斜杠)其他一些索引
#如果依赖easy_install的行为,实现可能会中断。
如果不是loc.endswith(“/”):
loc=loc+'/'
返回位置
如果url\u名称不是“无”:
地点=[
mkurl_pypi_url(url)
对于所有索引中的url]+self.find\u链接
其他:
位置=列表(self.find\u链接)
locations.extend(self.dependency\u链接)
对于req.absolute\u版本中的版本:
如果url\u name不是None,而main\u index\u url不是None:
地点=[
posixpath.join(主索引url.url,版本)]+位置
文件位置,url位置=self.\u排序位置(位置)
位置=[url\u位置中url的链接(url)]
logger.debug('搜索%s版本的URL:'%req)
对于位置中的位置:
logger.debug('*%s'%1!'位置)
已找到_版本=[]
找到\u versions.extend(
自包装版本(
[self.find_links]中url的链接(url,'-f'),req.name.lower())
页面_版本=[]
对于自取页面(位置、请求):
logger.debug('分析来自页面%s“%page.url”的链接)
logger.indent+=2
尝试:
page_versions.extend(self._package_versions(page.links,req.name.lower()))
最后:
logger.indent-=2
依赖项\u版本=列表(自.\u包\u版本)(
[self.dependency_links]中url的链接(url),req.name.lower())
如果依赖项为0个版本:
logger.info('找到的依赖项链接:%s“%”,'.join([link.url用于解析,链接,依赖项版本中的版本])
文件版本=列表(自.\u包版本)(
[文件位置中url的链接(url)],req.name.lower())
如果未找到\u版本,且未找到页面\u版本,且未找到依赖项\u版本,且未找到文件\u版本:
logger.fatal('找不到任何满足要求%s“%req”的下载)
raise DistributionNotFound('找不到%s“%req”的任何分发)
如果请求满足者不是无:
已找到\u versions.append((req.suited\u by.parsed\u version,Inf,req.suited\u by.version))
如果文件版本:
文件\u versions.sort(reverse=True)
logger.info('找到的本地文件:%s“%”,'.join([url\u到\u路径(link.url),用于解析,链接,文件中的版本])
找到的版本=文件版本+找到的版本
所有版本=找到的版本+页面版本+依赖性版本
适用的_版本=[]
对于所有_版本中的(已解析的_版本、链接、版本):
如果版本不在req.req中:
logger.info(“忽略链接%s,版本%s与%s不匹配”
%(链接,版本,','.join([''.join用于请求规范中的s]))
持续
适用的_版本。附加((链接,版本))
适用的版本=已排序(适用的版本,key=lambda v:pkg\u resources.parse\u version(v[1]),reverse=True)
现有_适用=bool([link fo
$ 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
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
root@node7:~# pip --version
pip 1.0 from /usr/lib/python2.7/dist-packages (python 2.7)
pip install pylibmc==
pip install --use-deprecated=legacy-resolver pylibmc==
pip install pylibmc==blork
https://pypi.org/pypi/{PKG_NAME}/json
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
...
#!/bin/bash
set -e

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

curl -L -s "$PACKAGE_JSON_URL" | jq  -r '.releases | keys | .[]' | sort -V
>>> 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')
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
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)))")
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
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
$ 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 install pylibmc== -v 2>/dev/null | awk '/Found link/ {print $NF}' | uniq
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
$ 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
$ 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
$