Python ve pip, bir paketin mevcut tüm sürümlerini listeliyor musunuz?


445

Pip ile kurulabilen bir Python paketinin adı göz önüne alındığında, pip'in kurabileceği tüm olası sürümlerinin bir listesini bulmanın herhangi bir yolu var mı? Şu anda deneme yanılma.

Üçüncü taraf kitaplığı için bir sürüm yüklemeye çalışıyorum, ancak en yeni sürüm çok yeni, geriye dönük uyumsuz değişiklikler yapıldı. Bu yüzden pip'in bildiği tüm sürümlerin bir listesine sahip olmak istiyorum, böylece onları test edebilirim.


1
Kabul edilen cevap, aynı çıktıyı üretmedikleri için komut dosyası olan diğer yanıtla eşdeğer değildir.
oligofren

17
Lütfen seçilen cevabı güncelleyin. Sarısı kırılmış ve gereksizdir. İle cevap pip install pylibmc==mükemmel.
Jonathan

@Jonathan'ın önerdiği gibi lütfen kabul edilen cevabı güncelleyin. Ben mükemmel demiyorum çünkü pip (v7 veya v8) önceki sürümlerinde çalışmaz, ama aksi takdirde harika.
Antony Hatchkins

1
@Rory lütfen kabul edilen cevabı güncelleyin, yumurta sarısı öldü. Chris Montanaro'nun cevabı şu anda IMO'nun en iyi yöntemidir.
Ryan Fisher

1
@Rory Lütfen bu popüler soruya gelecek ziyaretçilerin yararına kabul edilen cevabı değiştirin. Yolk projesi artık sürdürülmüyor ve bu cevap iddialarında olduğu gibi çalışmıyor.
wim

Yanıtlar:


167

(güncelleme: Mart 2020 tarihi itibariyle, birçok kişi ile yüklenmiş olduğu sarısı, bildirdin pip install yolk3ksadece son sürümünü döndürür. Chris'in cevabı en fazla oyuna sahip ve benim için çalıştı gibi görünüyor)

Pastebin betiği çalışır. Ancak, birden çok ortam / ana bilgisayarla çalışıyorsanız çok uygun değildir, çünkü her seferinde kopyalamanız / oluşturmanız gerekir.

Daha iyi bir çok yönlü çözüm , pip ile monte edilebilen yolk3k kullanmak olacaktır . Örneğin, hangi Django sürümlerinin mevcut olduğunu görmek için:

$ 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

yolk3k2012yolk yılında gelişimi durduran orijinalin bir çatal . Artık korunmuyor olsa da (aşağıdaki yorumlarda belirtildiği gibi), Python 3'ü desteklemektedir.yolkyolk3k

Not: Ben yolk3k gelişimine katılmıyorum. Bir şey olması gerektiği gibi çalışmıyorsa, buraya bir yorum bırakmak çok fazla fark yaratmamalıdır. Kullanım yolk3k sorun izleyicide yerine ve mümkünse bir düzeltme göndermeyi düşünebilirsiniz.


4
Aşağıdaki cevap (scriptbin'den script kullanarak) daha hantal, ama en azından benim durumumda (scipy sürümlerini arıyor) çalışıyor. yolk yalnızca son sürümü gösterir, diğer komut dosyası ise 0.8.0'a kadar olan tüm sürümleri gösterir.
oligofren

30
Çoğu zaman sadece en yeni sürümü döndürür
PawelRoman

17
Köknar python3 sadece pip install yolk3k kullanın. Sarısı komutu kullanılabilir.
Pierre Criulanscy

8
Sarısı gibi, çoğu zaman yolk3k sadece en yeni sürümü döndürür.
diabloneo

4
sarısı kırılmış / artık korunmamıştır. bu cevabı sil.
wim

837

İçin pip> = 9.0 kullanımı

$ 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==

- mevcut tüm sürümler ek paket indirilmeden veya kurulmadan yazdırılacaktır.

İçin pip <9.0 kullanımı

pip install pylibmc==blork

burada geçerli bir sürüm numarası olmayanblork herhangi bir dize olabilir .


25
Pip'in hatası tüm sürümleri tükürüyor garip buluyorum ama açıkça belirtilen verilere ulaşmak için hiçbir argümanı yok
Chris Montanaro

2
Bu çözümün bir başka güzel özelliği, kurulum kaynaklarını sınırlamak için tüm normal bayraklarla çalışmasıdır. Örneğin pip install --only-binary :all: pylibmc, ikili paketler halinde bulunan tüm pylibmc sürümlerini listeleyecektir.
pavon

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

18
Bu, başka paketlerin kurulmasını gerektirmediği için doğru yanıt olarak işaretlenmelidir.
Yves Dorfsman

5
Bunu pip'te yapmanın tek yolu gibi görünmek biraz saçma. Umarım böcek izleyicilerinde bu konuda en azından açık bir sorun vardır?
pmos

69

Güncelleme:
Eylül 2017 itibarıyla bu yöntem artık çalışmıyor: --no-installpip 7'de kaldırıldı

Kullan pip install -v, mevcut tüm sürümleri görebilirsiniz

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

Herhangi bir paket kurmamak için aşağıdaki çözümlerden birini kullanın:

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

veya

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 ile test edildi

root@node7:~# pip --version
pip 1.0 from /usr/lib/python2.7/dist-packages (python 2.7)

9
pip 1.5.4DEPRECATION: --no-install, --no-download, --build, and --no-clean are deprecated. See https://github.com/pypa/pip/issues/906.önceden yüklenmiş paketler için kullanılabilir sürümleri verir ve göstermez.
int_ua

2
tüm sürümleri göstermek için, sadece ihtiyacı var -v. Cevabımın geri kalanı ilave etkiyi önlemek (yükleme / indirme) içindir. Yüklü paketler için sadece --upgrade ekleyin. Ayrıca, her şeyi daha basit hale getirmek için ayrı bir sanal reklam oluşturabilirsiniz.
8'de HV

2
9.0.1 no such option: --no-install
havlama

-v'den "en yeni sürümler:" bazı sürümleri içermez.
mmacvicar

55

Bu bilgileri almak için üçüncü taraf bir pakete ihtiyacınız yoktur. pypi, altındaki tüm paketler için basit JSON yayınları sağlar

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

İşte tüm sürümleri alan standart kütüphaneyi kullanan bazı Python kodları.

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"))

Bu kod yazdırılıyor (23 Şubat 2015 itibariyle):

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 oldukça fazla yuvaya sahiptir. Eskiden 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 ile uyumlu sürümleri buluyordum. (Ben hiçbir cp26yerde görmedim , ama bazı paketler vardı, cp27ben bunun diğer paketlerde var olabileceğini tahmin ediyorum.)
tripleee

2
İşte kıvırmak, jq ve sort (bir "one-liner"!) İle yapmanın bir yolu: 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
Alan Ivey

1
Bu ValueError, çok katı olmayan sürümleme şemalarını takip eden bazı paketler için bir istisna atar . Bu paketler için düzeltmek için bu özete bakın .
TrinitronX

modası geçmiş bunu sizin için yapacak.
shadi

18

Ölü basit bash senaryosu buldum. Jq 'nin yazarı için teşekkürler .

#!/bin/bash
set -e

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

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

Güncelleme: Sürüm numarasına göre sıralama ekleyin.


Ben alamadı curlolasılıkla sertifika hataları, işe. wget --no-check-certificateçalışır, ama curl -k --insecurehiçbir şey üretmez. wgetERROR: certificate common name `www.python.org´ doesn´t match requested host name `pypi.python.org´.
İle

sort -VAit Homebrew versiyonu ile OSX çalışmıyorjq
deepelement


16

Pip'in koduna bir süre baktıktan sonra, paketleri bulmaktan sorumlu kodun PackageFindersınıfta bulunabileceği anlaşılıyor pip.index. Yöntemi find_requirement, a sürümlerini arar InstallRequirement, ancak maalesef sadece en son sürümü döndürür.

Aşağıdaki kod, orijinal işlevin neredeyse 1: 1 kopyasıdır ve 114. satırdaki dönüş tüm sürümleri döndürecek şekilde değiştirilmiştir.

Komut dosyası, ilk ve tek bağımsız değişken olarak bir paket adı bekler ve tüm sürümleri döndürür.

http://pastebin.com/axzdUQhZ

Pip koduna aşina olmadığım için doğruluğu garanti edemem. Ama umarım bu yardımcı olur.

Örnek çıktı

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

Kod:

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]

Bu, yukarıdaki cevaptan çok daha iyi çalıştı. sıska $ sarısı -V scipy scipy 0.12.0 sıska $ python test.py scipy Scipy sürümleri 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
oligofren

1
Bu kullanım dokümanlarda açıkça önerilmemektedir : " pip'in dahili API'lerini bu şekilde kullanmamalısınız "
wim

9

JSON API kullanarak PyPI'den bir paket için kullanılabilir sürümlerin listesini almak ve bunları ters kronolojik sırada yazdırmak için bu küçük Python 3 komut dosyasını (yalnızca standart kütüphane modüllerini kullanarak) kullanabilirsiniz . Burada yayınlanan diğer Python çözümlerinin aksine, bu django's ' 2.2rc1veya uwsgi's gibi gevşek sürümleri bozmaz 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')

Komut dosyasını kaydedin ve bağımsız değişken olarak paket adıyla çalıştırın, örneğin:

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

Bu benim için OSX'te çalışır:

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

Listeyi her satıra bir döndürür:

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

Veya en son sürümü edinmek için:

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

gsortSürümleri ayrıştırmak için (OSX'te) yüklü olması gerektiğini unutmayın . İle kurabilirsinizbrew install coreutils


Tanrım bu cevabı neden yayınladın? @Chris Montaro'nun cevabı işe yarar ve zariftir. Bu sadece gereksiz yere komplikasyon getiriyor
Brian Leach

@BrianLeach smh ... bir senaryoda kullanılmak üzere filtrelenen aynı yaklaşım ...
büyükanne

1
Benim için cygwin / bash'da çalışır, ikinci çözüm için cygwin'de gsort değil, sıralama kullanın.
WebComer

İşte piton tartışmalı verimleri Bash daha okunabilir kod ... @eric Çan'ın cevap (umarım :) yukarıda ... bakın
mirekphd

4

Projemde ludditebu özellik var.

Örnek kullanım:

>>> 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/ adresinin json API'sini sorgulayarak mevcut bir paketin tüm sürümlerini listeler.


Paketinizin ne yaptığını bize söyleseniz daha öğretici olurdu, aksi takdirde sadece yazılımınızı tanıtıyorsunuz :)
user228395

@ user228395 Yeterince açık olduğunu düşündüm, ancak mevcut olan bir paketin tüm sürümlerini listeledi, bu da sorunun başlığının tam olarak sorduğu şeydi. Düzenlendi - daha iyi mi?
wim

Elbette işleyişi. Yani @Timofey Stolbov tarafından sunulan çözümü özlüyor mu?
user228395

1
@ user228395 Bu cevap bash, curl ve jq kullandığından "sarma" demezdim, oysa luddite sadece Python standart kütüphanesini (urllib) kullanır. Ancak Stolbov'un çözümü pypi.org'da aynı son noktayı kullanıyor . Downvotunuzun nedeninin ne olduğunu sorabilir miyim?
wim

1
Proje detay sayfasının bağlantısını izlediyseniz, projenin ana özelliğinin requirements.txtdosyaları güncel olmayan paketler için kontrol etmek olduğunu görebilirsiniz . Birkaç satır koddan daha fazlasıdır. Bir requirements.txtdosyayı kontrol etmek için , tüm paket sürümlerini listeleme işlevine ihtiyacınız vardır. Bu bölüm bilerek ayrılmıştır ve luddite'ın genel API'sının bir parçasıdır. Ve kaynak Apache License 2.0, bence buna "kara kutu" yazılım paketi demek gerçekten adil değil.
wim

2

Ben herhangi bir şans yoktu yolk, yolk3kya pip install -vama ben (Eric Çan'ın cevaptan Python 3 adapte) bu kullanarak sona erdi:

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
StrictVersionBirçok paketler için çalışmaz ( django, uwsgi, psycopg2birkaç isim). Sen kullanabilirsiniz parse_version()dan setuptools(benim bkz cevabı bir örnek için).
Eugene Yarmash

1

Alternatif çözüm, Depo API'larını kullanmaktır:

https://warehouse.readthedocs.io/api-reference/json/#release

Örneğin, Flask için:

import requests
r = requests.get("https://pypi.org/pypi/Flask/json")
print(r.json()['releases'].keys())

yazdıracak:

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

bashSadece pythonkendine güvenen basit komut dosyası (soru bağlamında yüklenmesi gerektiğini varsayalım) ve curlya da biri wget. setuptoolsSürümleri sıralamak için paketin yüklü olduğu varsayımına sahiptir (neredeyse her zaman yüklüdür). Aşağıdaki gibi harici bağımlılıklara dayanmaz:

  • jq mevcut olmayabilir;
  • grepve awkbu Linux ve macOS üzerinde farklı davranabilir.
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)))"

Yorumlarla biraz daha uzun versiyon.

Paket adını bir değişkene yerleştirin:

PACKAGE=requests

Sürümleri edinin (kullanarak 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)))")

Sürümleri edinin (kullanarak 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)))")

Sıralı sürümleri yazdır:

echo $VERSIONS

-1

Benim alımım, çalışan bir python ortamından daha kolay kullanılmasını sağlamak için bazı değişiklikler ile gönderilen birkaç cevabın birleşimidir.

Buradaki fikir, kullanmanız için paket bulucunun bir örneğini veren tamamen yeni bir komut (install komutundan sonra modellenmiştir) sağlamaktır. Bunun tersi, pip'in yerel pip yapılandırma dosyalarınızı desteklediği ve okuduğu tüm dizinlerle çalışması ve kullanmasıdır, böylece normal bir pip kurulumunda olduğu gibi doğru sonuçları alırsınız.

Pip v 9.x ve 10.x ile uyumlu hale getirmeye çalıştım ama sadece 9.x'de denedim

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())

Örnek çıktı

./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

bu kullanım dokümanlarda açıkça önerilmez : " pip'in dahili API'lerini bu şekilde kullanmamalısınız "
wim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.