python सकल पीपी के साथ सभी पैकेजों का उन्नयन




व्हाट इस सकल (24)

मैंने रामाण के कोड की कोशिश की है और मुझे उबंटू पर पता चला है कि आपको प्रत्येक कमांड के लिए sudo लिखना है। यहां मेरी लिपि है जो उबंटू 13.10 पर ठीक काम करती है:

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("sudo pip install --upgrade " + dist.project_name, shell=True)

क्या pip साथ एक ही समय में सभी पायथन पैकेज अपग्रेड करना संभव है?

ध्यान दें कि आधिकारिक समस्या ट्रैकर पर इसके लिए एक सुविधा अनुरोध है


विंडोज पर काम करता है। दूसरों के लिए भी अच्छा होना चाहिए। ($ जो भी निर्देशिका आप हैं, कमांड प्रॉम्प्ट में। उदाहरण के लिए सी: / उपयोगकर्ता / उपयोगकर्ता नाम>)

कर

$ pip freeze > requirements.txt

टेक्स्ट फ़ाइल खोलें, == के साथ> = को प्रतिस्थापित करें

फिर करो

$ pip install -r requirements.txt --upgrade

यदि आपको अपग्रेड (कभी-कभी numpy) को रोकने वाले किसी निश्चित पैकेज के साथ कोई समस्या है, तो बस निर्देशिका ($) पर जाएं, नाम पर टिप्पणी करें (इससे पहले # जोड़ें) और फिर से अपग्रेड चलाएं। बाद में आप उस अनुभाग को वापस विघटित कर सकते हैं। यह पाइथन वैश्विक वातावरण की प्रतिलिपि बनाने के लिए भी बहुत अच्छा है।

मुझे पीपी-समीक्षा विधि भी पसंद है:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

आप सभी संकुल को अपग्रेड करने के लिए 'ए' का चयन कर सकते हैं; यदि एक अपग्रेड विफल रहता है, तो इसे फिर से चलाएं और यह अगले में जारी रहेगा।


यह मेरे लिए काम करना प्रतीत होता था ...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

मैंने पैकेज नामों को ठीक से अलग करने के लिए बाद में एक स्पेस के साथ printf उपयोग किया।


मेरी लिपि:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade

पीपी लोक को पुल-अनुरोध के माध्यम से भेजा गया; इस बीच मैंने इस पीआईपी लाइब्रेरी समाधान का उपयोग किया जो मैंने लिखा था:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

सभी स्थानीय पैकेजों को अपग्रेड करने के लिए; आप pip-review उपयोग कर सकते हैं:

$ pip install pip-review
$ pip-review --local --interactive

pip-review pip-tools का एक कांटा है। @knedlsepp द्वारा उल्लिखित pip-tools समस्या देखें। pip-review पैकेज काम करता है लेकिन pip-tools पैकेज अब काम नहीं करता है।

संस्करण 0.5 के बाद विंडोज़ पर pip-review काम करता है।


@ रामाण के उत्तर का एक-लाइनर संस्करण।

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`


वर्चुअलएन्व का उपयोग करते समय और यदि आप अपने वर्चुअलएन्व में जोड़े गए संकुल को अपग्रेड करना चाहते हैं, तो आप ऐसा करना चाहेंगे:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade

@ रामाणा के जवाब ने यहां मेरे लिए सबसे अच्छा काम किया, लेकिन मुझे कुछ कैच जोड़ना पड़ा:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

site-packages चेक में मेरे विकास पैकेज शामिल नहीं हैं, क्योंकि वे सिस्टम साइट-पैकेज निर्देशिका में स्थित नहीं हैं। कोशिश-छोड़कर बस पीपीपीआई से हटाए गए पैकेज को छोड़ देता है।

@endolith: मैं एक आसान pip.install(dist.key, upgrade=True) भी उम्मीद कर रहा था, लेकिन ऐसा लगता है कि पाइप का मतलब कुछ भी नहीं था लेकिन कमांड लाइन (दस्तावेज़ों का उल्लेख नहीं है आंतरिक एपीआई, और पीआईपी डेवलपर्स ने डॉकस्ट्रिंग का उपयोग नहीं किया)।


यह विकल्प मुझे अधिक सरल और पठनीय लगता है:

pip install -U `pip list --outdated | awk '{ print $1}'`

( awk '{ print $1}' लाइन के पहले शब्द का चयन करता है (एक स्थान से अलग))

और यह संस्करण pip list --outdated से चेतावनी संदेश के दमन के लिए अनुमति देता है - pip list --outdated :

pip install -U `pip list --outdated | awk '!/Could not|ignored/ { print $1}'`

( awk '!/<pattern>/' किसी दिए गए पैटर्न वाले रेखा को हटा देता है। मेरे मामले में चेतावनी संदेशों में क्रमशः "नहीं" और "अनदेखा" शामिल है)

इसका उपयोग आने वाले डिफ़ॉल्ट columns प्रारूप से निपटने के लिए भी किया जा सकता है:

pip install -U `pip list --format=columns --outdated | awk '!/Package|---/{ print $1}'`

बल्कि अद्भुत जर्दी यह आसान बनाता है।

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

जर्दी पर अधिक जानकारी के लिए: https://pypi.python.org/pypi/yolk/0.4.3

यह बहुत सी चीजें कर सकता है जो आपको शायद उपयोगी लगेगा।


पाइथन में एक स्क्रिप्ट के साथ करने का एक और तरीका है

import pip, tempfile, contextlib

with tempfile.TemporaryFile('w+') as temp:
    with contextlib.redirect_stdout(temp):
        pip.main(['list','-o'])
    temp.seek(0)
    for line in temp:
        pk = line.split()[0]
        print('--> updating',pk,'<--')
        pip.main(['install','-U',pk])

क्या यह अधिक प्रभावी नहीं है?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o पुरानी पैकेज सूचीबद्ध करता है;
  2. grep -v -i warning उलटा मिलान warning पर त्रुटियों से बचने के लिए warning
  3. cut -f1 -d1' ' पहला शब्द देता है - पुराने पैकेज का नाम;
  4. tr "\n|\r" " " मल्टीलाइन परिणाम को एक सिंगल-लाइन, स्पेस से अलग सूची में cut से परिवर्तित करता है;
  5. awk '{if(NR>=3)print}' हेडर लाइनों को छोड़ देता है
  6. cut -d' ' -f1 1 पहला कॉलम cut -d' ' -f1
  7. xargs -n1 pip install -U इसके बाईं ओर स्थित पाइप से 1 तर्क लेता है, और संकुल की सूची को अपग्रेड करने के लिए इसे कमांड में xargs -n1 pip install -U है।

यहां एक स्क्रिप्ट है जो पुरानी पैकेज को अपडेट करती है।

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "--outdated", "--format=legacy"])
line = str(file).split()

for distro in line[::6]:
    call("pip install --upgrade " + distro, shell=True)

निम्नलिखित एक-लाइनर सहायता का साबित हो सकता है:

pip list --format legacy --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 एक त्रुटि होने पर xargs -n1 रहती है।

यदि आपको छोड़ा गया है और क्या त्रुटि उत्पन्न करता है, तो आपको "ठीक दाग" नियंत्रण की आवश्यकता है, आपको -n1 ध्वज नहीं जोड़ना चाहिए और त्रुटियों को स्पष्ट रूप से परिभाषित करना चाहिए, प्रत्येक अलग त्रुटि के लिए निम्न पंक्ति "पाइपिंग" द्वारा:

| sed 's/^<First characters of the error>.*//'

यहां एक कामकाजी उदाहरण है:

pip list --format legacy --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

यह अधिक संक्षेप में लगता है।

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

स्पष्टीकरण:

pip list --outdated इन तरह की लाइनें pip list --outdated है

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

cut -d ' ' -f1 , -d ' ' डिलीमीटर के रूप में "स्थान" सेट करता है, -f1 मतलब पहला कॉलम प्राप्त करना है।

तो उपरोक्त रेखाएं बन जाती हैं:

urllib3
wheel

फिर आदेश को चलाने के रूप में प्रत्येक पंक्ति के साथ, कमांड, pip install -U चलाने के लिए xargs को पास करें

-n1 1 प्रत्येक कमांड pip install -U -n1 को पारित तर्कों की संख्या को सीमित करता है


विंडोज पावरहेल समाधान

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

https://github.com/cakebread/yolk :

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

हालांकि आपको पहले जर्दी प्राप्त करने की आवश्यकता है:

$ sudo pip install -U yolk

आप निम्न पायथन कोड का उपयोग कर सकते हैं। pip freeze विपरीत, यह चेतावनियां और FIXME त्रुटियों को मुद्रित नहीं करेगा।

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)

अजीब अद्यतन पैकेट का उपयोग करें: pip install -U $(pip freeze | awk -F'[=]' '{print $1}') -यू pip install -U $(pip freeze | awk -F'[=]' '{print $1}')


अभी तक एक अंतर्निहित ध्वज नहीं है, लेकिन आप इसका उपयोग कर सकते हैं

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

नोट: इसके लिए अनंत संभावित भिन्नताएं हैं। मैं इस उत्तर को छोटा और सरल रखने की कोशिश कर रहा हूं, लेकिन कृपया टिप्पणियों में बदलावों का सुझाव दें!

प्रासंगिक संपादन:

  • @ -e "पैकेज परिभाषाओं को छोड़ने के लिए एक grep जोड़ा गया, जैसा कि @ jawache द्वारा सुझाया गया है (हां, आप grep + को sed या awk या perl या ... के साथ cut सकते हैं)।
  • pip नए संस्करण आपको पुराने पैकेज सूचीबद्ध करने की अनुमति देते हैं:

    pip list --outdated --format=freeze
    
  • जोड़ा गया -n1 xargs , एक पैकेज को अद्यतन करने में विफल होने पर सब कुछ रोकने से रोकता है (धन्यवाद @andsens )


आप इसे आजमा सकते हैं:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done


कैसा रहेगा:

pip install -r <(pip freeze) --upgrade






pip