파이썬과 핍, 사용 가능한 패키지의 모든 버전을 나열합니까?


445

pip 로 설치할 수있는 Python 패키지의 이름이 주어지면 pip 로 설치할 수있는 모든 가능한 버전 목록을 찾을 수있는 방법이 있습니까? 지금은 시행 착오입니다.

타사 라이브러리 용 버전을 설치하려고하는데 최신 버전이 너무 새 버전이므로 이전 버전과 호환되지 않는 변경 사항이있었습니다. 그래서 어떻게 든 pip가 알고있는 모든 버전의 목록을 가지고 싶습니다. 그래서 테스트 할 수 있습니다.


1
허용되는 답변은 동일한 출력을 생성하지 않으므로 스크립트를 사용하는 다른 답변과 동일하지 않습니다.
oligofren

17
선택한 답변을 업데이트하십시오. 노른자는 부서지고 불필요합니다. 대답 pip install pylibmc==은 완벽합니다.
Jonathan

@Jonathan이 제안한대로 수락 된 답변을 업데이트하십시오. 이전 버전의 pip (v7 또는 v8)에서는 작동하지 않기 때문에 완벽하게 부르지는 않지만 그렇지 않은 경우에는 훌륭합니다.
Antony Hatchkins

1
@Rory 허용 된 답변을 업데이트하십시오. 노른자가 죽었습니다. Chris Montanaro의 답변은 현재 IMO에 가장 적합한 방법입니다.
Ryan Fisher

1
@Rory이 인기있는 질문에 대한 향후 방문자의 이익을 위해 허용 된 답변을 변경하십시오. 노른자 프로젝트는 더 이상 유지되지 않으며 단순히 그 답이 주장하는 것처럼 작동하지 않습니다.
wim

답변:


167

(업데이트 : 2020 년 3 월 현재 많은 사람들이을 통해 설치된 노른자 pip install yolk3k가 최신 버전 만 반환 한다고보고했습니다 . Chris의 답변 이 가장지지가 높고 저를 위해 일한 것 같습니다)

pastebin의 스크립트가 작동합니다. 그러나 여러 환경 / 호스트로 작업하는 경우 매번 복사 / 생성해야하므로 매우 편리하지 않습니다.

더 나은 만능 솔루션은 pip로 설치할 수있는 yolk3k 를 사용 하는 것입니다. 예를 들어 어떤 장고 버전을 사용할 수 있는지 확인하십시오.

$ 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 개발을 중단 한 원본의 포크입니다 . 비록 (아래 설명에 표시된대로) 더 이상 유지되지 않는 것으로 나타나고 파이썬 3를 지원합니다.yolkyolk3k

참고 : 나는 yolk3k의 개발에 관여하지 않습니다. 무언가가 제대로 작동하지 않는 경우 여기에 의견을 남기면 큰 차이가 없습니다. 사용 yolk3k 이슈 트래커를 대신 가능하면 수정을 제출하는 것이 좋습니다.


4
아래의 답변 (pastbin의 스크립트 사용)은 더 번거롭지 만 적어도 내 경우에는 (scipy 버전 검색) 작동합니다. yolk는 사용 가능한 마지막 버전 만 표시하고 다른 스크립트는 0.8.0으로 거슬러 올라간 모든 버전을 표시합니다.
oligofren

30
대부분의 경우 최신 버전 만 반환합니다
PawelRoman

17
Fir python3은 pip install yolk3k를 사용합니다. 노른자 명령을 사용할 수 있습니다.
Pierre Criulanscy

8
노른자와 마찬가지로 대부분의 경우 노른자 3k는 최신 버전 만 반환합니다.
diabloneo

4
노른자가 부서 지거나 더 이상 유지되지 않습니다. 이 답변을 삭제하십시오.
wim

836

대한 핍> = 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
나는 pip의 오류가 모든 버전을 뱉어내는 것이 이상하다고 생각하지만 명시 적으로 데이터를 얻을 수있는 논쟁이 없습니다.
Chris Montanaro

2
이 솔루션의 또 다른 장점은 모든 일반 플래그와 함께 작동하여 설치 원본을 제한한다는 것입니다. 예를 들어 pip install --only-binary :all: pylibmc바이너리 패키지로 사용 가능한 모든 pylibmc 버전을 나열합니다.
pavon

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

18
다른 패키지를 설치할 필요가 없으므로 정답으로 표시해야합니다.
Yves Dorfsman

5
이것이 핍 에서이 작업을 수행하는 유일한 방법 인 것 같습니다. 버그 추적기에 적어도 이것에 대해 공개 된 문제가 있기를 바랍니다.
pmos

69

업데이트 :
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)

9
pip 1.5.4DEPRECATION: --no-install, --no-download, --build, and --no-clean are deprecated. See https://github.com/pypa/pip/issues/906.이미 설치된 패키지에 사용 가능한 버전을 제공 하고 표시하지 않습니다.
int_ua

2
모든 버전을 표시하려면 필요합니다 -v. 내 대답의 나머지 부분은 추가 효과 (설치 / 다운로드)를 피하기위한 것입니다. 설치된 pkg의 경우 --upgrade를 추가하십시오. 또한 별도의 virtualenv를 만들어 모든 것을 간단하게 만들 수 있습니다.
HVNSweeting

2
pip 9.0.1 짖는 소리 :no such option: --no-install
tired_of_nitpickers

-v의 "최신 버전 :"은 일부 버전을 제외합니다.
mmacvicar

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]])]파이썬 2.6과 호환 버전을 찾을 수 있습니다. ( cp26어디서도 보지 못했지만 일부 패키지는 cp27다른 패키지에 존재할 수 있다고 추측합니다.)
tripleee

2
curl, jq 및 sort ( "한 줄짜리")로 수행하는 방법은 다음과 같습니다. 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
ValueError엄격한 버전 관리 체계를 따르지 않는 일부 패키지 의 경우 예외 가 발생합니다. 이러한 패키지에 대해 수정하려면 이 요지를 참조하십시오 .
TrinitronX

구식 이 당신을 위해 이것을 할 것입니다.
shadi

18

Dead-Simple 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

sort -V의 사제의 버전 OSX에서 작동하지 않습니다jq
deepelement

16

노른자 대신 노른자 3k 패키지를 사용할 수 있습니다. yolk3k는 원래의 노른자위의 포크이며 python2와 3을 모두 지원합니다.

https://github.com/myint/yolk

pip install yolk3k

노른자는 파이썬 3.x에서 작동하지 않기 때문에 알기 편리했습니다.
Broken Man

1
yolk3k 반환 날에만 설치된 버전 :yolk -V attest Attest 0.5.3
안토니 Hatchkins

2
yolk3k는 최신 버전 만 반환하는 것 같습니다.
mvherweg

16

pip의 코드를 잠시 살펴본 후 패키지 찾기를 담당하는 코드는의 PackageFinder클래스에서 찾을 수 있습니다 pip.index. 이 메서드 find_requirement는의 버전을 조회 InstallRequirement하지만 불행히도 최신 버전 만 반환합니다.

아래 코드는 원래 함수의 거의 1 : 1 사본이며 114 행의 리턴은 모든 버전을 리턴하도록 변경되었습니다.

스크립트는 하나의 패키지 이름을 첫 번째 인수로만 예상하고 모든 버전을 반환합니다.

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
oligofren

1
이 사용법은 문서 에서 명시 적으로 권장하지 않습니다 . " 이 방법으로 pip의 내부 API를 사용해서는 안됩니다 "
wim

9

이 작은 Python 3 스크립트 (표준 라이브러리 모듈 만 사용)를 사용하여 JSON API를 사용하여 PyPI에서 패키지에 사용 가능한 버전 목록을 가져 와서 역순으로 인쇄 할 수 있습니다. 다른 파이썬 솔루션은 여기에 게시 달리,이 같은 느슨한 버전에 휴식하지 않습니다 django2.2rc1또는 uwsgi2.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.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


Jeez 왜이 답변을 게시 했습니까? @Chris Montaro의 답변은 효과적이고 우아합니다. 이것은 불필요하게 합병증을 소개합니다
Brian Leach

@BrianLeach smh ... 스크립트에서 사용하기 위해 필터링 된 것과 동일한 접근 방식 ...
grandma

1
cygwin / bash에서 나를 위해 작동합니다. 두 번째 솔루션은 cygwin에서 gsort가 아닌 sort를 사용합니다.
WebComer

여기 파이썬은 bash보다 더 읽기 쉬운 코드를 생성합니다 ... @eric chiang의 답장 (
위적으로

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

https://pypi.org/ 의 json API를 쿼리하여 사용 가능한 모든 패키지 버전을 나열합니다.


패키지가 무엇을하고 있는지 알려 주시면 더 유익 할 것입니다. 그렇지 않으면 소프트웨어를 홍보하는 것입니다. :)
user228395

@ user228395 나는 그것이 충분히 명백하다고 생각했지만 사용 가능한 패키지의 모든 버전을 나열합니다. 이것은 질문의 제목이 요구하는 것과 정확히 일치합니다. 편집-더 좋습니까?
wim

물론 작동합니다. @Timofey Stolbov가 제시 한 솔루션을 본질적으로 포장하고 있습니까?
user228395

1
@ user228395 나는 "래핑"이라고 부르지 않을 것이다. 왜냐하면 대답은 bash, curl 및 jq를 사용하기 때문이다. 반면에 luddite는 단지 파이썬 표준 라이브러리 (urllib)를 사용한다. 그러나 Stolbov의 솔루션에 같은 엔드 포인트 사용하지 pypi.org을 . 당신의 downvote의 이유가 무엇인지 물어봐도 될까요?
wim

1
프로젝트 세부 사항 페이지에 대한 링크를 따라 가면 프로젝트의 주요 기능은 requirements.txt오래된 패키지의 파일을 확인 하는 것입니다. 두 줄 이상의 코드입니다. requirements.txt파일 을 확인하려면 모든 패키지 버전을 나열하는 기능이 필요합니다. 이 부분은 의도적으로 분리되어 있으며 luddite의 공개 API의 일부입니다. 그리고 그것은 소스 Apache License 2.0이며, "블랙 박스"소프트웨어 패키지라고 부르는 것이 불공평하다고 생각합니다.
wim

2

나는 어떤 운이 없었다 yolk, yolk3k또는 pip install -v하지만, 그래서 나는 (에릭 치앙마이의 대답에서 파이썬 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많은 패키지에 대해 작동하지 않습니다 ( django, uwsgi, psycopg2몇 가지 이름). parse_version()에서 사용할 수 있습니다 setuptools( 예는 내 답변 참조 ).
유진 야마 쉬

1

대체 솔루션은 Warehouse API를 사용하는 것입니다.

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

예를 들어 플라스크의 경우 :

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또는 중 하나입니다 wget. setuptools버전을 정렬하기 위해 패키지가 설치되어 있다고 가정합니다 (거의 항상 설치됨). 다음과 같은 외부 종속성에 의존하지 않습니다.

  • jq 존재하지 않을 수도 있습니다.
  • grep그리고 awk그 리눅스와 맥 OS에서 다르게 작동 할 수 있습니다.
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

필자는 실행중인 파이썬 환경에서 사용하기 쉽도록 몇 가지 수정 된 답변과 함께 게시 된 답변을 결합한 것입니다.

아이디어는 사용할 패키지 파인더의 인스턴스를 제공하는 완전히 새로운 명령 (설치 명령 이후 모델링)을 제공하는 것입니다. 단점은 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

이 사용은 명시 적으로 권장하지 않습니다 워드 프로세서 : " 이 방법으로 핍의 내부 API를 사용하지 않아야합니다 "
WIM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.