python - एसक - व्हाट इस सकल




पीपी के साथ सभी पैकेजों का उन्नयन (20)

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

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


अजीब अद्यतन पैकेट का उपयोग करें: 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 )


आप निम्न पायथन कोड का उपयोग कर सकते हैं। 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 freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

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

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 है।

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

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

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


मुझे उन्नयन के साथ एक ही समस्या थी। बात यह है कि, मैं सभी संकुल को अपग्रेड नहीं करता हूं। मैं केवल वही अपग्रेड करता हूं जो मुझे चाहिए, क्योंकि परियोजना टूट सकती है।

चूंकि पैकेज द्वारा पैकेज को अपग्रेड करने और pip-upgrader फ़ाइल को अपडेट करने का कोई आसान तरीका नहीं था, इसलिए मैंने यह pip-upgrader लिखा था जो आपके द्वारा चुनी गई संकुल (या सभी संकुल) के लिए आपकी requirements.txt pip-upgrader फ़ाइल में संस्करणों को अद्यतन करता है

स्थापना

pip install pip-upgrader

प्रयोग

अपने वर्चुअलएएन को सक्रिय करें (महत्वपूर्ण, क्योंकि यह मौजूदा वर्चुअलएएन में उन्नत पैकेज के नए संस्करण भी स्थापित करेगा)।

अपनी परियोजना निर्देशिका में cd , फिर चलाएं:

pip-upgrade

उन्नत उपयोग

यदि आवश्यकताओं को गैर-मानक स्थान में रखा गया है, तो उन्हें तर्क के रूप में भेजें:

pip-upgrade path/to/requirements.txt

यदि आप पहले ही जानते हैं कि आप किस पैकेज को अपग्रेड करना चाहते हैं, तो बस उन्हें तर्क के रूप में भेजें:

pip-upgrade -p django -p celery -p dateutil

यदि आपको प्री-रिलीज / पोस्ट-रिलीज़ संस्करण में अपग्रेड करना है, तो अपने आदेश में --prerelease तर्क जोड़ें।

पूर्ण प्रकटीकरण: मैंने यह पैकेज लिखा था।


मैं हाल ही में pur का उपयोग कर रहा हूँ। यह सरल और बिंदु है। यह अपग्रेड को प्रतिबिंबित करने के लिए आपकी requirements.txt फ़ाइल को अपडेट करता है और फिर आप अपनी requirements.txt . requirements.txt फ़ाइल को सामान्य रूप से अपग्रेड कर सकते हैं।

$ pip install pur
...
Successfully installed pur-4.0.1

$ pur
Updated boto3: 1.4.2 -> 1.4.4
Updated Django: 1.10.4 -> 1.10.5
Updated django-bootstrap3: 7.1.0 -> 8.1.0
All requirements up-to-date.

$ pip install --upgrade -r requirements.txt
Successfully installed Django-1.10.5 ...

मैंने रामाण के कोड की कोशिश की है और मुझे उबंटू पर पता चला है कि आपको प्रत्येक कमांड के लिए 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 install -U $(pip list --outdated|awk '{printf $1" "}')

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


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

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}'`

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

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)

रॉब वैन डेर वाउडे द्वारा फोर के लिए उत्कृष्ट documentation परामर्श के बाद विंडोज संस्करण

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i

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

कर

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


अधिक मजबूत समाधान

पीपी 3 के लिए इसका उपयोग करें:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

पाइप के लिए, बस 3s को इस प्रकार हटा दें:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

ओएसएक्स विषमता

ओएसएक्स, जुलाई 2017 तक, एक बहुत पुराना संस्करण (एक दर्जन वर्ष पुराना) वाला जहाज। विस्तारित नियमित अभिव्यक्तियों को प्राप्त करने के लिए, उपरोक्त समाधान में -r के बजाय -E का उपयोग करें।

लोकप्रिय समाधान के साथ मुद्दों को हल करना

यह समाधान अच्छी तरह डिज़ाइन और परीक्षण 1 है , जबकि सबसे लोकप्रिय समाधानों में भी समस्याएं हैं।

  • बदलती पीपी कमांड लाइन सुविधाओं के कारण पोर्टेबिलिटी मुद्दे
  • Xargs का क्रैशिंग क्योंकि आम पाइप या पीपी 3 बाल प्रक्रिया विफलताओं
  • कच्चे xargs आउटपुट से भीड़ लॉगिंग
  • एक पाइथन-टू-ओएस पुल पर निर्भर करते हुए संभावित रूप से इसे अपग्रेड करते हुए 3

उपरोक्त आदेश इन मुद्दों को पूरी तरह से दूर करने के लिए sed और sh के संयोजन में सबसे सरल और सबसे पोर्टेबल पाइप सिंटैक्स का उपयोग करता है। Sedation ऑपरेशन का विवरण टिप्पणी संस्करण 2 के साथ जांच की जा सकती है।

विवरण

[1] परीक्षण और नियमित रूप से एक लिनक्स 4.8.16-200.fc24.x86_64 क्लस्टर में प्रयोग किया जाता है और पांच अन्य लिनक्स / यूनिक्स स्वादों पर परीक्षण किया जाता है। यह विंडोज 10 पर स्थापित सिगविन 64 पर भी चलता है। आईओएस पर परीक्षण की आवश्यकता है।

[2] आदेश की शारीरिक रचना को और अधिक स्पष्ट रूप से देखने के लिए, यह टिप्पणियों के साथ उपरोक्त pip3 कमांड का सटीक समतुल्य है:

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh

[3] एक पाइथन या पीआईपी घटक का उन्नयन जिसे पाइथन या पीआईपी घटक के उन्नयन में भी उपयोग किया जाता है, डेडलॉक या पैकेज डेटाबेस भ्रष्टाचार का संभावित कारण हो सकता है।


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

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

`





pip