سؤال

هل من الممكن ترقية جميع حزم بيثون في وقت واحد مع pip?

ملحوظة: أن هناك طلب ميزة لهذا على تعقب العدد الرسمي.

هل كانت مفيدة؟

المحلول

لا يوجد علامة مدمجة حتى الآن ، ولكن يمكنك استخدامها

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

ملاحظة: هناك اختلافات محتملة لا حصر لها لهذا الغرض. أحاول الحفاظ على هذه الإجابة قصيرة وبسيطة ، ولكن من فضلك اقترح الاختلافات في التعليقات!

في الإصدار الأقدم من pip, ، يمكنك استخدام هذا بدلاً من ذلك:

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

ال grep هو تخطي تعريفات الحزمة القابلة للتحرير ("-e") ، كما اقترح @jawache. (نعم ، يمكنك استبدال grep+cut مع sed أو awk أو perl أو...).

ال -n1 العلم ل xargs يمنع إيقاف كل شيء في حالة فشل تحديث حزمة واحدة (شكرًا andsens).

نصائح أخرى

يمكنك استخدام رمز بيثون التالي. على عكس pip freeze, ، هذا لن يطبع التحذيرات وأخطاء إصلاح.لـ PIP <10.0.1

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

import pkg_resources
from subprocess import call

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

لترقية جميع الحزم المحلية ؛ يمكنك استخدام pip-review:

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

pip-review هو شوكة pip-tools. نرى pip-tools القضية ذكرها knedlsepp. pip-review الحزمة تعمل ولكن pip-tools الحزمة لم تعد تعمل.

pip-review يعمل على Windows منذ الإصدار 0.5.

يعمل على Windows. يجب أن تكون جيدة للآخرين أيضا. ($ هو أي دليل أنت فيه ، في موجه الأوامر.

فعل

$ pip freeze > requirements.txt

افتح الملف النصي واستبدل == مع >= وتنفيذ

$ pip install -r requirements.txt --upgrade

إذا كانت لديك مشكلة في حزمة معينة تعطل الترقية (Numpy في بعض الأحيان) ، فما عليك سوى الانتقال إلى الدليل ($) ، والتعليق على الاسم (أضف # قبل ذلك) وقم بتشغيل الترقية مرة أخرى. يمكنك في وقت لاحق فك هذا القسم مرة أخرى. هذا رائع أيضًا لنسخ البيئات العالمية Python.


طريق اخر:

أحب أيضًا طريقة PIP-Review:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

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

يمكنك تحديد "A" لترقية جميع الحزم ؛ إذا فشلت ترقية واحدة ، قم بتشغيله مرة أخرى واستمر في آخر.

إصدار Windows بعد الاستشارة ممتازة توثيق إلى عن على FOR بقلم روب فان دير وودي

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

يستخدم pipupgrade!

$ pip install pipupgrade
$ pipupgrade --latest --yes

pipupgrade يساعدك requirements.txt ملف! كما أنها ترقية بشكل انتقائي الحزم التي لا تحطم التغيير. يضمن Pipupgrade أيضًا ترقية الحزم الموجودة داخل بيئات Python متعددة. متوافق مع Python2.7+، Python3.4+و PIP9+، PIP10+، PIP18+، PIP19+.

enter image description here

ملاحظة: أنا مؤلف الأداة.

يمكنك فقط طباعة الحزم التي عفا عليها الزمن

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

قد يثبت الواحد التالي للمساعدة:

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

xargs -n1 يواصل الذهاب في حالة حدوث خطأ.

إذا كنت بحاجة إلى مزيد من التحكم في "الحبيبات الدقيقة" حول ما تم حذفه وما الذي يرفع خطأً ، يجب ألا تضيف -n1 العلم وتحديد الأخطاء بشكل صريح لتجاهلها ، عن طريق "الأناقة" في السطر التالي لكل خطأ منفصل:

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

هنا مثال عمل:

pip list --format freeze --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 -U `pip list --outdated | tail -n +3 | awk '{print $1}'`

التفسير هو ذلك pip list --outdated يخرج قائمة بجميع الحزم القديمة في هذا التنسيق:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

tail -n +3 يتخطى الخطين الأولين و awk '{print $1}' يحدد الكلمة الأولى من كل سطر.

حل أكثر قوة

ل PIP3 استخدم هذا:

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

بالنسبة لـ PIP ، فقط قم بإزالة 3s على هذا النحو:

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

OSX Oddity

OSX ، اعتبارًا من يوليو 2017 ، يشحن بنسخة قديمة جدًا من SED (عشر سنوات). للحصول على تعبيرات منتظمة ممتدة ، استخدم -e بدلاً من -r في الحل أعلاه.

حل المشكلات مع الحلول الشعبية

تم تصميم هذا الحل بشكل جيد واختباره1, ، في حين أن هناك مشاكل مع الحلول الأكثر شعبية.

  • مشكلات قابلية النقل بسبب تغيير ميزات سطر أوامر PIP
  • تحطيم XARGs لأن PIP أو PIP3 فشل عملية الطفل
  • تسجيل مزدحمة من ناتج XARGS الخام
  • الاعتماد على جسر بيثون إلى أوس مع ترقيته المحتمل3

يستخدم الأمر أعلاه أبسط بناء جملة PIP الأكثر قابلية المحمولة مع SED و SH للتغلب على هذه المشكلات تمامًا. يمكن فحص تفاصيل عملية SED مع الإصدار المعلق2.


تفاصيل

1] تم اختباره واستخدامه بانتظام في مجموعة Linux 4.8.16-200.fc24.x86_64 واختبارها على خمسة نكهات أخرى Linux/UNIX. كما أنه يعمل على Cygwin64 المثبت على Windows 10. هناك حاجة إلى اختبار على iOS.

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 أو PIP المستخدم أيضًا في ترقية مكون Python أو PIP سببًا محتملاً لفساد قاعدة بيانات الحزمة.

هذا يبدو أكثر إيجازا.

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

تفسير:

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

ثم مررهم إلى xargs لتشغيل الأمر ، pip install -U, ، مع كل سطر كحجال إلحادية

-n1 يحد من عدد الوسائط التي تم تمريرها إلى كل أمر pip install -U ليكون 1

واجهت نفس المشكلة في الترقية. الشيء هو ، أنا لا أقوم بترقية جميع الحزم. أقوم بترقية ما أحتاجه فقط ، لأن المشروع قد يكسر.

لأنه لم تكن هناك طريقة سهلة لترقية الحزمة حسب الحزمة ، وتحديث ملف required.txt ، كتبت هذا pip poprgrader أيّ يقوم أيضًا بتحديث الإصدارات في requirements.txt ملف للحزم المختارة (أو جميع الحزم).

تثبيت

pip install pip-upgrader

الاستخدام

قم بتنشيط VirtualEnv (مهم ، لأنه سيقوم أيضًا بتثبيت الإصدارات الجديدة من الحزم التي تمت ترقيتها في VirtualEnV الحالية).

cd في دليل المشروع الخاص بك ، ثم قم بتشغيله:

pip-upgrade

الاستخدام المتقدم

إذا تم وضع المتطلبات في موقع غير قياسي ، فأرسلها كوسيط:

pip-upgrade path/to/requirements.txt

إذا كنت تعرف بالفعل الحزمة التي تريد ترقيتها ، فما عليك سوى إرسالها كوسائط:

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

إذا كنت بحاجة إلى الترقية إلى إصدار ما قبل الإصدار / ما بعد الإصدار ، أضف --prerelease حجة إلى أمرك.

الكشف الكامل: كتبت هذه الحزمة.

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

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

ومع ذلك تحتاج إلى الحصول على صفار البيض أولاً:

$ sudo pip install -U yolk

نسخة واحدة من @إجابة رامانا.

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

`

عند استخدام VirtualEnv وإذا كنت تريد فقط ترقية الحزم وأضاف إلى VirtualEnv الخاص بك ، قد ترغب في القيام:

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

حل Windows PowerShell

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

أبسط وأسرع حل وجدته في مناقشة قضية PIP هو:

sudo -H pip install pipdate
sudo -H pipdate

مصدر: https://github.com/pypa/pip/issues/3819

يمكنك تجربة هذا:

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

صفار الصفار المذهل إلى حد ما يجعل هذا سهلاً.

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

يمكن أن تفعل الكثير من الأشياء التي ربما تجدها مفيدة.

استخدم حزم تحديث AWK: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

تحديث Windows PowerShell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

@إجابة رامانا عملت بشكل أفضل بالنسبة لي ، من هؤلاء هنا ، لكن اضطررت إلى إضافة عدد قليل من المصيد:

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 يستبعد Check حزم التطوير الخاصة بي ، لأنها غير موجودة في دليل حزم موقع النظام. يتخطى المحاولة ببساطة الحزم التي تمت إزالتها من PYPI.

endolith: كنت آمل أن يكون الأمر سهلاً pip.install(dist.key, upgrade=True), ، أيضًا ، ولكن لا يبدو أن PIP كان من المفترض أن يستخدمه أي شيء سوى سطر الأوامر (لا تذكر المستندات واجهة برمجة التطبيقات الداخلية ، ولم يستخدم مطورو PIP المستندات).

أرسلت من خلال تراجع سحب إلى قوم PIP; ؛ في غضون ذلك ، استخدم حل مكتبة PIP هذا:

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 install -U $(pip list --outdated|awk '{printf $1" "}')

إستعملت printf مع مساحة بعد ذلك لفصل أسماء الحزمة بشكل صحيح.

أقصر وأسهل على النوافذ.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

نصي:

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

أليس هذا أكثر فاعلية؟

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 لتجنب الأخطاء عند التحديث
  3. cut -f1 -d1' ' إرجاع الكلمة الأولى - اسم الحزمة القديمة ؛
  4. tr "\n|\r" " " يحول النتيجة المتعددة من cut في قائمة واحدة ، مفصولة الفضاء ؛
  5. awk '{if(NR>=3)print}' تخطي خطوط الرأس
  6. cut -d' ' -f1 يجلب العمود الأول
  7. xargs -n1 pip install -U يأخذ وسيطة واحدة من الأنبوب اليسار منه ، وينقلها إلى الأمر لترقية قائمة الحزم.

هذا هو حل PowerShell لـ Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

وللبيثون 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

هذا ترقية الحزم واحدة تلو الأخرى. لذلك أ

pip3 check
pip2 check

بعد ذلك يجب أن تتأكد من عدم كسر أي تبعيات.

ماذا عن:

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

ال pip_upgrade_outdated لا وظيفة. حسبها مستندات:

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

الخطوة 1:

pip install pip-upgrade-outdated

الخطوة 2:

pip_upgrade_outdated
import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
    pip.main(['install', '--upgrade', pkg])

او حتى:

import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)

يعمل بسرعة لأنه لا يتم إطلاق قذيفة باستمرار. أحب أن أجد الوقت للحصول على هذا بالفعل باستخدام القائمة القديمة لتسريع الأمور لا تزال أكثر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top