كيفية ترقية جميع حزم Python مع 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+.
ملاحظة: أنا مؤلف الأداة.
يمكنك فقط طباعة الحزم التي عفا عليها الزمن
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
يمكنك تجربة هذا:
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
pip list -o
يسرد حزم عفا عليها الزمن.grep -v -i warning
مباراة مقلوبة علىwarning
لتجنب الأخطاء عند التحديثcut -f1 -d1' '
إرجاع الكلمة الأولى - اسم الحزمة القديمة ؛tr "\n|\r" " "
يحول النتيجة المتعددة منcut
في قائمة واحدة ، مفصولة الفضاء ؛awk '{if(NR>=3)print}'
تخطي خطوط الرأسcut -d' ' -f1
يجلب العمود الأول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)
يعمل بسرعة لأنه لا يتم إطلاق قذيفة باستمرار. أحب أن أجد الوقت للحصول على هذا بالفعل باستخدام القائمة القديمة لتسريع الأمور لا تزال أكثر.