পাইথন এবং পাইপ, উপলব্ধ যে প্যাকেজের সমস্ত সংস্করণ তালিকাবদ্ধ করবেন?


445

একটি পাইথন প্যাকেজ যে সঙ্গে ইনস্টল করা যাবে এর নাম দেওয়া পিপ , কোনো উপায় যে পিপ ইনস্টল করতে পারে এটা সব সম্ভব সংস্করণ একটি তালিকা খুঁজে বের করতে হয়? এখনই এটি পরীক্ষা এবং ত্রুটি।

আমি তৃতীয় পক্ষের লাইব্রেরির জন্য একটি সংস্করণ ইনস্টল করার চেষ্টা করছি, তবে নতুন সংস্করণটি খুব নতুন back সুতরাং আমি কোনওভাবে পিপ সম্পর্কে জেনে থাকা সমস্ত সংস্করণগুলির একটি তালিকা রাখতে চাই, যাতে আমি সেগুলি পরীক্ষা করতে পারি।


1
গৃহীত উত্তর স্ক্রিপ্টের সাথে অন্যটির সমতুল্য নয় কারণ তারা একই আউটপুট তৈরি করে না।
অলিগোফ্রেন

17
নির্বাচিত উত্তর আপডেট করুন। কুসুম ভাঙ্গা এবং অপরিবর্তিত। উত্তরটি pip install pylibmc==নিখুঁত।
জোনাথন

@ জোনাথনের পরামর্শ অনুসারে গৃহীত উত্তরটি আপডেট করুন। আমি এটিকে নিখুঁত বলব না কারণ এটি পাইপের পূর্ববর্তী সংস্করণগুলিতে (ভি 7 বা ভি 8) কাজ করবে না, তবে অন্যথায় দুর্দান্ত।
অ্যান্টনি হ্যাচকিনস

1
@ ররি দয়া করে গৃহীত উত্তরটি আপডেট করুন, কুসুম মারা গেছে। ক্রিস মন্টানারোর উত্তর হ'ল আইএমও সেরা পদ্ধতি।
রায়ান ফিশার

1
@ ররি দয়া করে এই জনপ্রিয় প্রশ্নের ভবিষ্যতের দর্শকদের সুবিধার জন্য গৃহীত উত্তরটি পরিবর্তন করুন। কুসুম প্রকল্পটি আর রক্ষণাবেক্ষণ করা হয় না এবং উত্তরগুলির দাবি হিসাবে এটি কার্যকরভাবে কাজ করে না।
wim

উত্তর:


167

(আপডেট: ২০২০ সালের মার্চ পর্যন্ত, অনেক লোক জানিয়েছে যে এর মাধ্যমে ইনস্টল করা কুসুম pip install yolk3kকেবল সর্বশেষ সংস্করণ দেয় Chris ক্রিসের উত্তরে মনে হয় সর্বাধিক উন্নতি হয়েছে এবং আমার পক্ষে কাজ করেছে)

পেস্টবিনে স্ক্রিপ্টটি কাজ করে। তবে আপনি একাধিক পরিবেশ / হোস্টের সাথে কাজ করছেন তবে এটি খুব সুবিধাজনক নয় কারণ আপনাকে প্রতিবার এটি অনুলিপি / তৈরি করতে হবে।

চারপাশের আরও ভাল সমাধান হ'ল ইয়লক 3 কে ব্যবহার করা হবে যা পাইপ সহ ইনস্টল করার জন্য উপলব্ধ। উদাহরণস্বরূপ জাঙ্গোর কোন সংস্করণ উপলব্ধ তা দেখতে:

$ 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পাইথন 3 সমর্থন করে এবং সমর্থন করে।

দ্রষ্টব্য: আমি কুসুম 3 কে উন্নয়নের সাথে জড়িত নই। কিছু যদি এটির মতো কাজ করে না মনে হয় তবে এখানে একটি মন্তব্য রেখে খুব বেশি পার্থক্য করা উচিত নয়। ব্যবহার করুন yolk3k ইস্যু যে ব্যক্তি অনুসরণ করে পরিবর্তে এবং একটি ফিক্স জমা দেওয়ার সময়, সম্ভব হলে বিবেচনা।


4
নীচের উত্তর (পেস্টবিন থেকে স্ক্রিপ্ট ব্যবহার করে) আরও জটিল, তবে আমার ক্ষেত্রে কমপক্ষে কাজ করে (স্কিপি সংস্করণের জন্য অনুসন্ধান করা)। কুসুম কেবল সর্বশেষ সংস্করণটি উপলভ্য দেখায়, অন্য স্ক্রিপ্টটি 0.8.0 এর পূর্ববর্তী সংস্করণ দেখায়।
ওলিগোফ্রেন

30
বেশিরভাগ সময় এটি কেবলমাত্র নতুন সংস্করণটি ফিরে আসবে
পাভেলরোমন

17
ফির পাইথন 3 কেবল পাইপ ইনস্টল করুন ইয়োক 3 কে। কুসুম কমান্ড উপলব্ধ হবে।
পিয়ের ক্রুনালেন্সি

8
কুসুমের মতো, বেশিরভাগ সময় ইয়োক 3k কেবলমাত্র নতুন সংস্করণ দেয়।
ডায়াবলনেও

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
আমার কাছে এটি অদ্ভুত বলে মনে হচ্ছে যে পাইপের ত্রুটিটি সমস্ত সংস্করণটি ছড়িয়ে দিয়েছে তবে তাদের স্পষ্টভাবে তথ্যের সাথে যুক্ত হওয়ার কোনও যুক্তি নেই
ক্রিস মন্টানারো

2
এই সমাধানটির আর একটি দুর্দান্ত সম্পত্তি হ'ল এটি ইনস্টলেশন উত্স সীমাবদ্ধ করতে সমস্ত সাধারণ পতাকা নিয়ে কাজ করে। উদাহরণস্বরূপ pip install --only-binary :all: pylibmcবাইনারি প্যাকেজ হিসাবে উপলব্ধ পাইলিবএমসি এর সমস্ত সংস্করণ তালিকাবদ্ধ করবে।
প্যাভন

3
pip install pylibmc==9999999 | tr ', ' "\n" | sort -n
বিকাশ

18
এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত কারণ এটি অন্য কোনও প্যাকেজ ইনস্টল করার প্রয়োজন হয় না।
ইয়ভেস ডরফসম্যান

5
এটি কিছুটা হাস্যকর বিষয় যে পাইপটিতে এটি করার একমাত্র উপায় বলে মনে হয়। আমি আশা করি তাদের বাগ ট্র্যাকারে এই সম্পর্কে কমপক্ষে একটি মুক্ত সমস্যা আছে?
pmos

69

আপডেট:
সেপ্টেম্বর 2017 পর্যন্ত এই পদ্ধতিটি আর কাজ করে না: --no-installপিপ 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

পাইপ 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। আমার উত্তরটির বাকি অংশগুলি অতিরিক্ত প্রভাব এড়ানো (ইনস্টল / ডাউনলোড) এড়ানোর জন্য। ইনস্টল করা পিকেজির জন্য, কেবলমাত্র - আপগ্রেড যুক্ত করুন। নতুন, আপনি সবকিছুকে আরও সহজ করার জন্য একটি পৃথক ভার্চুয়ালেনভ তৈরি করতে পারেন।
HVNSweeting

2
পিপ 9.0.1 বার্কস:no such option: --no-install
ক্লান্ত_ফোঁজ_নিটপিকাররা

"সংস্করণগুলির সর্বশেষতম:" থেকে -v কিছু সংস্করণ বাদ দেয়।
mmacvicar

55

এই তথ্য পেতে আপনার কোনও তৃতীয় পক্ষের প্যাকেজ দরকার নেই। পিপিআই এর অধীনে সমস্ত প্যাকেজগুলির জন্য সহজ জেএসএন ফিড সরবরাহ করে

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

এখানে কয়েকটি স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে পাইথন কোড দেওয়া হয়েছে যা সমস্ত সংস্করণ পায়।

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

এই কোড মুদ্রণ (ফেব্রুয়ারী 23 শে, 2015 হিসাবে):

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
জেএসএনের মোটামুটি বাসা বাঁধে। আমি versions = [x for x in data["releases"] if any([y["python_version"] in ['cp26', '2.6'] for y in data["releases"][x]])]পাইথন ২.6 এর সাথে সামঞ্জস্যপূর্ণ সংস্করণগুলি খুঁজে পেয়েছি । (আমি cp26কোথাও দেখতে পেলাম না , তবে কিছু প্যাকেজগুলির cp27তাই অনুমান করেছি যে এটি অন্যান্য প্যাকেজগুলিতে থাকতে পারে))
ট্রিপলি

2
কার্ল, জকিউ এবং সাজানোর (একটি "ওয়ান-লাইনার"!) দিয়ে এটি করার একটি উপায়: 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এমন কয়েকটি প্যাকেজগুলির ব্যতিক্রম ছুঁড়েছে যা এত কঠোর সংস্করণীকরণের স্কিম অনুসরণ করে না। এই প্যাকেজগুলির জন্য এটি ঠিক করতে, এই টুকরোটি দেখুন
ট্রিনিট্রনএক্স

পুরানো আপনার জন্য এটি করবে।
দয়া

18

আমি ডেড-সিম্পল বাশ স্ক্রিপ্ট নিয়ে এসেছি। জেকেউ এর লেখককে ধন্যবাদ ।

#!/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´.
ট্রিপলি

sort -Vএর homebrew এর সংস্করণ সঙ্গে ওএসএক্স কাজ করে নাjq
deepelement

16

আপনি কুসুমের পরিবর্তে yolk3k প্যাকেজটি পেতে পারেন। yolk3k মূল কুসুম থেকে একটি কাঁটাচামচ এবং এটি পাইথন 2 এবং 3 উভয় সমর্থন করে।

https://github.com/myint/yolk

pip install yolk3k

এটি জানার সুবিধা ছিল, যেহেতু কুসুম অজগর 3.x এর অধীনে কাজ করে না
ব্রোকেন ম্যান

1
yolk3k আমার জন্য কেবল ইনস্টল করা সংস্করণটি ফিরিয়ে দেয়:yolk -V attest Attest 0.5.3
অ্যান্টনি হ্যাচকিনস

2
yolk3k কেবল সর্বশেষতম সংস্করণটি ফেরত দেবে বলে মনে হচ্ছে?
mvherweg

16

কিছুক্ষণ পিপের কোড দেখার পরে, দেখে মনে হচ্ছে প্যাকেজগুলি সনাক্ত করার জন্য দায়বদ্ধ কোডটি PackageFinderক্লাসে পাওয়া যাবে pip.index। এর পদ্ধতিটি find_requirementএগুলির সংস্করণগুলি সন্ধান করে InstallRequirementতবে দুর্ভাগ্যক্রমে কেবল সাম্প্রতিকতম সংস্করণটি পাওয়া যায়।

নীচের কোডটি মূল ফাংশনের প্রায় 1: 1 অনুলিপি, 114 লাইনে রিটার্ন সহ সমস্ত সংস্করণ ফিরিয়ে আনল।

স্ক্রিপ্টটি একটি প্যাকেজের নামটিকে প্রথম এবং একমাত্র যুক্তি হিসাবে প্রত্যাশা করে এবং সমস্ত সংস্করণ দেয়।

http://pastebin.com/axzdUQhZ

আমি সঠিকতার গ্যারান্টি দিতে পারি না, কারণ আমি পাইপের কোডের সাথে পরিচিত নই। তবে আশা করি এটি সাহায্য করবে।

নমুনা আউটপুট

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]

এটি উপরের উত্তরের চেয়ে সম্পূর্ণ আরও ভাল কাজ করেছে। চর্মসার $ কুসুম-ভি স্কিপি স্কিপি 0.12.0 চর্মসার y পাইথন টেস্ট.পি স্কিপি স্কিপি এর সংস্করণগুলি 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
এই ব্যবহারটি ডক্সে স্পষ্টতই নিরুৎসাহিত করা হয়েছে : " আপনাকে পিপের অভ্যন্তরীণ এপিআইগুলি এইভাবে ব্যবহার করা উচিত নয় "
উইম

9

আপনি এই ছোট পাইথন 3 স্ক্রিপ্টটি ব্যবহার করতে পারেন (কেবলমাত্র স্ট্যান্ডার্ড লাইব্রেরি মডিউলগুলি ব্যবহার করে) পিএসআই থেকে প্যাকেজের জন্য উপলব্ধ সংস্করণগুলির তালিকা জেএসএন এপিআই ব্যবহার করে তাদের বিপরীত কালানুক্রমিক ক্রমে মুদ্রণ করতে। এখানে পোস্ট করা কিছু পাইথন সমাধানগুলির বিপরীতে, এটি django's 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='\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

https://pypi.python.org/pypi/Django/ - যে প্যাকেজগুলির রক্ষণাবেক্ষণকারীরা সমস্ত প্যাকেজ দেখাতে পছন্দ করে তাদের জন্য কাজ করে https://pypi.python.org/simple/pip/ - কৌশলটি যে কোনওভাবে করা উচিত (সমস্ত লিঙ্কের তালিকাবদ্ধ)


7

এটি ওএসএক্সে আমার জন্য কাজ করে:

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সংস্করণগুলি পার্স করার জন্য (ওএসএক্সে) ইনস্টল করতে হবে। আপনি এটি দিয়ে ইনস্টল করতে পারেনbrew install coreutils


জীজ কেন আপনি এই উত্তরটি পোস্ট করেছিলেন। @ ক্রিস মন্টারোর উত্তর কার্যকর এবং মার্জিত। এটি কেবল অযথা জটিলতার পরিচয় দেয়
ব্রায়ান লিচ

@ ব্রায়ানলিচ এসএমএইচ ... স্ক্রিপ্টে ব্যবহারের জন্য এটি একই পদ্ধতি ফিল্টার হয়েছে ...
ঠাকুরমা

1
আমার জন্য সাইগউইন / বাশে কাজ করে, দ্বিতীয় সমাধান ব্যবহারের জন্য বাছাই করুন, সাইগউইনে জিএসোর্ট নয়।
ওয়েবকোমার

এখানে পাইথন বাশের চেয়ে তাত্ক্ষণিকভাবে আরও বেশি পঠনযোগ্য কোডের ফলন করেছে ... দেখুন @ এরিক চিয়াংয়ের উত্তর (আশা করি :) উপরে ...
মিরেক্ফড

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/ এর জেসন এপিআই অনুসন্ধান করে উপলব্ধ প্যাকেজের সমস্ত সংস্করণ তালিকাভুক্ত করে


আপনার প্যাকেজটি কী করছে তা যদি আমাদের জানান তবে তা আরও শিক্ষণীয় হবে, অন্যথায় আপনি কেবল আপনার সফটওয়্যারটি প্রচার করছেন :)
ব্যবহারকারী 228395

@ ব্যবহারকারী 228395 আমি ভেবেছিলাম এটি যথেষ্ট সুস্পষ্ট, তবে এটি উপলব্ধ এমন একটি প্যাকেজের সমস্ত সংস্করণ তালিকাভুক্ত করে যা প্রশ্নের শিরোনাম সম্পর্কে জিজ্ঞাসা করা ঠিক এটিই ছিল। সম্পাদিত - ভাল?
wim

এটি অবশ্যই কাজ করে। সুতরাং এটি মূলত @ টিমফিয়ে স্টলবভের উপস্থাপিত সমাধানটি মোড়ানো?
ব্যবহারকারী 228395

1
@ ব্যবহারকারী 228395 আমি এটিকে "মোড়ানো" বলব না, যেহেতু এই উত্তরটিতে ব্যাশ, কার্ল এবং জেকিউ ব্যবহার করা হয়েছে - যেখানে লুডাইট কেবল পাইথন স্ট্যান্ডার্ড লাইব্রেরি (urllib) ব্যবহার করে। তবে স্টলবভের সমাধানটি পাইপ.আইআরজে একই প্রান্ত পয়েন্টটি ব্যবহার করে । আমি জিজ্ঞাসা করতে পারি আপনার ডাউনটোটের কারণ কী?
wim

1
আপনি যদি প্রকল্পের বিশদ পৃষ্ঠার লিঙ্কটি অনুসরণ করেন তবে আপনি দেখতে পেলেন যে প্রকল্পের মূল বৈশিষ্ট্যটি পুরানো requirements.txtপ্যাকেজগুলির জন্য ফাইলগুলি পরীক্ষা করা। এটি কোডের কয়েক লাইনের চেয়ে বেশি। কোনও requirements.txtফাইল চেক করার জন্য , সমস্ত প্যাকেজ সংস্করণ তালিকাভুক্ত করার জন্য আপনার কার্যকারিতা প্রয়োজন। এই অংশটি ইচ্ছাকৃতভাবে ডিকপলড এবং লুডাইটের পাবলিক এপিআইয়ের একটি অংশ। এবং এটি উত্স অ্যাপাচি লাইসেন্স ২.০, আমি মনে করি এটি "ব্ল্যাক-বাক্স" সফ্টওয়্যার প্যাকেজ হিসাবে বলা সত্যিই ন্যায্য নয়।
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

বিকল্প সমাধান হ'ল গুদাম এপিআই ব্যবহার করা:

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এটি লিনাক্স এবং ম্যাকোজে আলাদা আচরণ করতে পারে।
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

আমার নেওয়া হ'ল অজগর পরিবেশের মধ্যে দিয়ে এটিকে আরও সহজ করার জন্য কিছু পরিবর্তন সহ কিছু পোস্ট করা উত্তরগুলির সংমিশ্রণ।

ধারণাটি হ'ল সম্পূর্ণ নতুন কমান্ড (ইনস্টল কমান্ডের পরে মডেল করা) সরবরাহ করা যা আপনাকে প্যাকেজ সন্ধানকারীর ব্যবহারের জন্য একটি উদাহরণ দেয়। উত্সাহটি হ'ল এটি আপনার স্থানীয় পাইপ কনফিগারেশন ফাইলগুলিকে পিপ সমর্থন করে এবং পড়তে পারে এমন কোনও সূচকগুলির সাথে কাজ করে এবং ব্যবহার করে, যাতে আপনি একটি সাধারণ পাইপ ইনস্টল করার সাথে সঠিক ফলাফল পাবেন।

আমি এটি উভয় পাইপ 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

এই ব্যবহারটি ডক্সে স্পষ্টতই নিরুৎসাহিত করা হয়েছে : " আপনাকে পিপের অভ্যন্তরীণ এপিআইগুলি এইভাবে ব্যবহার করা উচিত নয় "
উইম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.