Pythonとpip、利用可能なパッケージのすべてのバージョンを一覧表示しますか?


445

pipでインストールできるPythonパッケージの名前を考えると、pipがインストールできるすべての可能なバージョンのリストを見つける方法はありますか?現在、それは試行錯誤です。

サードパーティライブラリのバージョンをインストールしようとしていますが、最新バージョンが新しすぎるため、下位互換性のない変更が行われました。それで、pipが知っているすべてのバージョンのリストをどうにかして、テストできるようにしたいと思います。


1
受け入れられた回答は、同じ出力を生成しないため、スクリプトを使用した他の回答と同等ではありません。
オリゴフレン2013

17
選択した回答を更新してください。卵黄は壊れて不要です。との答えpip install pylibmc==は完璧です。
ジョナサン

@Jonathanが示唆するように、受け入れられた回答を更新してください。以前のバージョンのpip(v7またはv8)では機能しないため、完璧とは言えませんが、それ以外の場合は優れています。
アントニーハッチキンス2017

1
@ロリーは承認された回答を更新してください、卵黄は死んでいます。クリス・モンタナロの答えは、現在IMOで最も良い方法です。
ライアンフィッシャー

1
@Roryこの人気のある質問への将来の訪問者のために、承認済みの回答を変更してください。Yolkプロジェクトはもはや維持されておらず、その答えが主張するように単に機能しません。
2019年

回答:


167

(更新:2020年3月の時点で、を介してインストールされた卵黄pip install yolk3kは最新バージョンのみを返すと多くの人が報告しています。 クリスの回答が最も賛成票を持ち、私のために働いたようです)

pastebinのスクリプトは機能します。ただし、複数の環境/ホストで作業している場合は、毎回コピー/作成する必要があるため、あまり便利ではありません。

より優れた総合的なソリューションは、pipでインストールできるyolk3kを使用することです。たとえば、利用可能な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

yolk3k2012年にyolk開発を中止したオリジナルのフォークです。(以下のコメントで示されているように)もはや保守されていませんが、Python 3のようであり、Python 3をサポートしています。yolkyolk3k

注:私はyolk3kの開発には関与していません。何かが正常に機能していないように見える場合、ここにコメントを残しても大きな違いはないはずです。代わりにyolk3kの課題追跡を使用し、可能であれば修正の提出を検討してください。


4
以下の答え(pastebinのスクリプトを使用)はより面倒ですが、少なくとも私の場合(scipyのバージョンを検索する場合)は機能します。yolkは利用可能な最後のバージョンのみを表示し、他のスクリプトは0.8.0までのすべてのバージョンを表示します。
オリゴフレン2013

30
ほとんどの場合、最新バージョンのみを返します
PawelRoman '23

17
Fir python3は、pip install yolk3kを使用するだけです。yolkコマンドが使用可能になります。
Pierre Criulanscy 2015

8
yolkと同様に、ほとんどの場合、yolk3kは最新バージョンのみを返します。
diabloneo

4
卵黄が壊れている/維持されなくなった。この回答を削除します。
ウィム

834

以下のためのピップ> = 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==

–使用可能なすべてのバージョンが印刷され、追加のパッケージを実際にダウンロードまたはインストールする必要はありません。

以下のためのピップ<9.0の使用

pip install pylibmc==blork

ここで、有効なバージョン番号blorkではない任意の文字列を指定できます。


25
ピップのエラーがすべてのバージョンを吐き出すのは奇妙だと思いますが、これらのデータに明示的にアクセスするための引数はありません
Chris Montanaro

2
このソリューションのもう1つの優れた特性は、すべての通常のフラグと連携してインストールソースを制限することです。たとえばpip install --only-binary :all: pylibmc、バイナリパッケージとして利用可能なpylibmcのすべてのバージョンを一覧表示します。
pavon 2016年

3
pip install pylibmc==9999999 | tr ', ' "\n" | sort -n
Vikas 2017

18
これは、他のパッケージをインストールする必要がないため、正解としてマークする必要があります。
イブ・ドルフスマン2018年

5
これがpipでこれを行う唯一の方法であるように見えるのは少しばかげています。バグトラッカーに少なくともこれに関する未解決の問題があるといいのですが。
pmos

69

更新:
2017年9月以降、この方法は機能しなくなり--no-installました。pip7で削除されました

を使用すると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)

9
pip 1.5.4与えDEPRECATION: --no-install, --no-download, --build, and --no-clean are deprecated. See https://github.com/pypa/pip/issues/906.、すでにインストールされているパッケージのために利用可能なバージョンが表示されません。
int_ua 2015年

2
すべてのバージョンを表示するには、が必要-vです。私の残りの答えは、追加効果(インストール/ダウンロード)を回避するためです。インストールされたpkgの場合、-upgradeを追加するだけです。Anw、すべてをより簡単にするために個別のvirtualenvを作成できます。
HVNSweeting 2015年

2
pip 9.0.1鳴き声:no such option: --no-install
tired_of_nitpickers 2017年

「最新バージョン」:-vから一部のバージョンが除外されます。
mmacvicar 2017年

55

この情報を取得するためにサードパーティのパッケージは必要ありません。pypiは、以下のすべてのパッケージにシンプルなJSONフィードを提供します

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

すべてのバージョンを取得する標準ライブラリのみを使用するPythonコードを次に示します。

import json
import urllib2
from distutils.version import StrictVersion

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

2
JSONにはかなりの入れ子があります。私は使用versions = [x for x in data["releases"] if any([y["python_version"] in ['cp26', '2.6'] for y in data["releases"][x]])]のPython 2.6との互換性のあるバージョンを見つけること。(cp26どこにも表示されませんでしたが、パッケージによってはcp27、他のパッケージに存在する可能性があると推測しました。)
tripleee

2
ここで、カール、JQ、およびソートでそれを行う方法です(「ワンライナーは、」!): curl -s https://pypi.python.org/pypi/{PKG_NAME}/json | jq -r '.releases | keys[]' | sort -t. -k 1,1n -k 2,2n -k 3,3n
アラン・アイヴィー

1
これは、ValueErrorそれほど厳密ではないバージョン管理スキームに従う一部のパッケージに対して例外をスローします。これらのパッケージで修正するには、この要点を参照してください
TrinitronX

古いものはあなたのためにこれを行います。
shadi

18

私は完全にシンプルなbashスクリプトを思いつきました。jqの作者に感謝します。

#!/bin/bash
set -e

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

curl -s "$PACKAGE_JSON_URL" | jq  -r '.releases | keys | .[]' | sort -V

更新:バージョン番号によるソートを追加。


curlおそらく証明書のエラーが原因で、仕事に行くことができませんでした。 wget --no-check-certificate動作しますが、curl -k --insecure何も生成されません。私が得る警告wgetは言うERROR: certificate common name `www.python.org´ doesn´t match requested host name `pypi.python.org´.
tripleee '18年

sort -V自作のバージョンでOSX上では動作しませんjq
deepelement

16

yolkの代わりにyolk3kパッケージを使用できます。yolk3kはオリジナルのyolkのフォークで、python2と3の両方をサポートしています。

https://github.com/myint/yolk

pip install yolk3k

yolkはpython 3.xでは機能しないので、これは知っておくと役に立ちました
Broken Man

1
yolk3k戻って私のためにのみインストールされたバージョン:yolk -V attest Attest 0.5.3
アントニーHatchkins

2
yolk3kは最新バージョンのみを返すようですか?
mvherweg 2018

16

しばらくpipのコードを見ると、パッケージの場所を特定するコードがのPackageFinderクラスにあるようpip.indexです。そのメソッドfind_requirementは、InstallRequirement残念ながら最新バージョンのみを返します。

以下のコードは、元の関数のほぼ1:1のコピーであり、114行目のリターンがすべてのバージョンを返すように変更されています。

スクリプトは、最初の唯一の引数として1つのパッケージ名を想定し、すべてのバージョンを返します。

http://pastebin.com/axzdUQhZ

私は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]

これは上記の答えよりもはるかにうまくいきました。skinny $ yolk -V scipy scipy 0.12.0 skinny $ python test.py scipy scipyのバージョン0.12.0 0.12.0 0.11.0 0.11.0 0.10.1 0.10.1 0.10.0 0.10.0 0.9.0 0.9.0 0.8.0
オリゴフレン2013

1
この使用法はドキュメントで明示的に推奨されていません:「pipの内部APIをこのように使用してはなりません
wim

9

この小さなPython 3スクリプト(標準ライブラリモジュールのみを使用)を使用すると、JSON APIを使用してPyPIからパッケージの利用可能なバージョンのリストを取得し、新しい順に出力できます。いくつかの他のPythonのソリューションはここに掲載とは異なり、これはのような緩いバージョンでは壊れないdjango2.2rc1uwsgiさん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
...


7

これは私にとってOSXで動作します:

pip install docker-compose== 2>&1 \
| grep -oE '(\(.*\))' \
| awk -F:\  '{print$NF}' \
| sed -E 's/( |\))//g' \
| tr ',' '\n'

1行に1つずつリストを返します。

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 \
| grep -oE '(\(.*\))' \
| awk -F:\  '{print$NF}' \
| sed -E 's/( |\))//g' \
| tr ',' '\n' \
| gsort -r -V \
| head -1
1.10.0rc2

gsortバージョンを解析するには、OSXにインストールする必要があることに注意してください。あなたはそれをインストールすることができますbrew install coreutils


どうしてこの答えを投稿したの?@Chris Montaroの回答は機能し、エレガントです。これは単に不必要に複雑さをもたらします
ブライアンリーチ

@BrianLeach smh ...スクリプトで使用するためにフィルタリングされた同じアプローチ...
おばあちゃん

1
私にとってはcygwin / bashで動作します。2番目のソリューションでは、cygwinのgsortではなくsortを使用します。
WebComer 2018

ここでpythonは間違いなくbashよりも読みやすいコードを生成します...上記の@eric chiangの応答を参照してください(うまくいけば:)...
mirekphd

4

私のプロジェクトに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')

のjson APIを照会することにより、利用可能なパッケージのすべてのバージョンをリストします。 https://pypi.org/のます


あなたのパッケージが何をしているか教えてくれればもっと
有益

@ user228395私はそれは十分明白であると思いましたが、利用可能なパッケージのすべてのバージョンをリストしています。それはまさに質問のタイトルが尋ねるものでした。編集-良いですか?
WIM

もちろんその働き。つまり、@ Timofey Stolbovによって提示されたソリューションを本質的にラップしていますか?
user228395

1
@ user228395その回答はbash、curl、jqを使用しているため、「ラッピング」とは呼びません。一方、ludditeはPython標準ライブラリ(urllib)を使用するだけです。しかしStolbovからの溶液を上の同じエンドポイントを使用していpypi.org。反対票を投じた理由は何ですか。
WIM

1
プロジェクトの詳細ページへのリンクをたどると、プロジェクトの主な機能がrequirements.txt古いパッケージのファイルをチェックすることであることがわかります。数行のコード以上です。requirements.txtファイルをチェックするには、すべてのパッケージバージョンを一覧表示する機能が必要です。この部分は意図的に分離されており、ludditeのパブリックAPIの一部です。そして、それはApache License 2.0のソースです。私はそれを「ブラックボックス」ソフトウェアパッケージと呼ぶのは本当に公平ではないと思います。
WIM

2

私はすべての運を持っていなかったyolkyolk3kまたはpip install -v私はこれを使用して終了して(エリック・チェンマイの答えからの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
...

1
StrictVersion多くのパッケージのために動作しません(djangouwsgipsycopg2数名に)。parse_version()from を使用できますsetuptools(例については私の回答を参照してください)。
Eugene Yarmash

1

代替ソリューションは、ウェアハウス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'])

0

自分bashだけに依存する単純なスクリプトpython(質問のコンテキストでは、インストールする必要があると思います)およびcurlまたはのいずれかwgetsetuptoolsバージョンをソートするためにパッケージがインストールされていることを前提としています(ほとんどの場合、インストールされています)。次のような外部の依存関係には依存しません。

  • 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

-1

私の見解は、いくつかの投稿された回答を組み合わせたもので、実行中のpython環境内から簡単に使用できるようにいくつかの変更が加えられています。

アイデアは、使用するパッケージファインダーのインスタンスを提供する完全に新しいコマンド(installコマンドをモデルにしたもの)を提供することです。良い点は、pipがサポートし、ローカルのpip構成ファイルを読み取るすべてのインデックスで機能し、使用するため、通常のpipインストールの場合と同じように正しい結果が得られることです。

私はそれを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

この使用法はドキュメントで明示的に推奨されていません:「pipの内部APIをこのように使用してはなりません
wim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.