จะอัพเกรดแพ็คเกจ Python ทั้งหมดด้วย pip ได้อย่างไร


2050

เป็นไปได้ไหมที่จะอัพเกรดแพ็คเกจ Python ทั้งหมดในคราวเดียวด้วยpip?

หมายเหตุ : มีการร้องขอคุณสมบัติสำหรับตัวติดตามปัญหาอย่างเป็นทางการ


37
ระวังซอฟต์แวร์เน่า - การพึ่งพาการอัปเกรดอาจทำให้แอปของคุณพัง คุณสามารถแสดงเวอร์ชันที่แน่นอนของแพ็คเกจที่ติดตั้งทั้งหมดด้วยpip freeze(เช่นbundle installหรือnpm shrinkwrap) ที่ดีที่สุดในการบันทึกสำเนาของที่ก่อนที่จะซ่อม
พันเอก Panic

ระวังเมื่อทำเช่นนี้คุณสกรูของคุณติดตั้งขึ้นเมื่อคุณอัพเกรดpip เกิดข้อผิดพลาดคือrequests cannot import name IncompleteRead
Paul Rooney

11
ฉันลองคำตอบมากมายและใหม่กว่า (และคำตอบที่ให้คะแนนต่ำ) ให้ผลลัพธ์ที่ดีกว่า: stackoverflow.com/questions/2720014//
FauChristian

คำขอและการสนทนาเกี่ยวกับคุณลักษณะล่าสุด: github.com/pypa/pip/issues/4551
cledoux

คำถามนี้ทั้งเก่าและมีประโยชน์มากฉันแค่อยากจะเตือนทุกคนที่มาที่นี่ตั้งแต่ตอนนี้ว่าตอนนี้มีวิธีที่ดีที่สุดอย่างเป็นทางการในการทำสิ่งนี้ทั้งหมด: pipenv เอกสารอยู่ที่นี่: docs.pipenv.org/basicsและผู้เขียน PyCon 2018 พูดคุยเกี่ยวกับเรื่องนี้อยู่ที่นี่: youtube.com/watch?v=GBQAKldqgZs การเข้ารหัสที่มีความสุข!
Malik A. Rumi

คำตอบ:


2259

ยังไม่มีธงในตัว แต่คุณสามารถใช้

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

The grepคือการข้ามคำจำกัดความแพคเกจที่สามารถแก้ไขได้ ("-e") ตามที่แนะนำโดย @jawache (ใช่คุณสามารถแทนที่grep+ cutด้วยsedหรือawkหรือperlหรือ ... )

การ-n1ตั้งค่าสถานะเพื่อxargsป้องกันการหยุดทุกอย่างหากการอัปเดตหนึ่งแพคเกจล้มเหลว (ขอบคุณ@andsens )


59
ขวา :( ปัญหาตอนนี้อาศัยอยู่ที่github.com/pypa/pip/issues/59แต่ทุกคำแนะนำดูเหมือนจะตอบด้วย "ใช่ แต่ฉันแน่ใจว่า X เป็นวิธีที่เหมาะสมที่จะทำ Y" ... ตอนนี้ดีกว่าไม่เคย? การปฏิบัติจริงเต้นความบริสุทธิ์หรือไม่ :(
rbp

20
นอกจากนี้ยังพิมพ์แพ็คเกจเหล่านั้นที่ติดตั้งด้วยตัวจัดการแพคเกจปกติ (เช่น apt-get หรือ Synaptic) หากฉันดำเนินการสิ่งนี้pip install -Uมันจะอัปเดตแพ็คเกจทั้งหมด ฉันกลัวว่ามันอาจทำให้เกิดความขัดแย้งกับ apt-get
Jabba

8
วิธีเปลี่ยน grep เป็น: egrep -v '^ (\ - e | #)' (ฉันได้รับบรรทัดนี้เมื่อใช้งานบน Ubuntu 12.10: "## FIXME: ไม่พบ svn URL ใน dependency_links สำหรับแพ็คเกจนี้:"
LasseValentini

32
ฉันขว้างteeก่อนอัปเกรดจริงเพื่อที่คุณจะได้รับรายชื่อของรูปแบบเดิม เช่น pip freeze --local | tee before_upgrade.txt | ...นั้นจะเป็นการง่ายกว่าหากมีปัญหา
Emil H

10
ฉันเพิ่ม-Hเพื่อsudoหลีกเลี่ยงข้อความแสดงข้อผิดพลาดที่น่ารำคาญ: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S

683

คุณสามารถใช้รหัส Python ดังต่อไปนี้ ซึ่งแตกต่างจากpip freezeนี้จะไม่พิมพ์คำเตือนและข้อผิดพลาด FIXME สำหรับ 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)

21
นี้ทำงานได้อย่างน่าอัศจรรย์ดี ... มันเสมอเพื่อความพึงพอใจเมื่องานต้องใช้เวลาจริงๆนาน ... และช่วยให้คุณมีพวงของสิ่งใหม่! PS: รันเป็น root หากคุณใช้ OS X!
Alex Gray

52
จะไม่มีวิธีติดตั้งโดยใช้ pip โดยไม่ต้องเรียก subprocess หรือไม่? สิ่งที่ชอบimport pip pip.install('packagename')?
endolith

6
ฉันห่อนี้ขึ้นมาในfabfile.py ขอบคุณ!
Josh K

5
@BenMezger: คุณไม่ควรใช้แพ็คเกจระบบใน virtualenv ของคุณ คุณไม่ควรรันมากกว่าหนึ่งโปรแกรมที่เชื่อถือได้และเป็นที่รู้จักในฐานะ root ใช้ virtualenvs ของคุณด้วย --no-site-packages (ค่าเริ่มต้นในรุ่นล่าสุด)
jeffcook2150

3
คำตอบที่เลือก (ด้านบน) ล้มเหลวหากไม่พบแพ็คเกจอีกต่อไป สคริปต์นี้จะดำเนินต่อไปยังแพ็คเกจถัดไปที่ยอดเยี่ยม
Josh

642

เพื่ออัพเกรดแพ็คเกจท้องถิ่นทั้งหมด; คุณสามารถใช้pip-review:

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

pip-reviewpip-toolsเป็นทางแยกของ ดูpip-toolsปัญหาที่กล่าวถึงโดย@knedlsepp pip-reviewแพ็คเกจใช้งานได้ แต่pip-toolsแพ็คเกจใช้งานไม่ได้อีกต่อไป

pip-reviewทำงานบน Windows ตั้งแต่รุ่น 0.5


2
@hauzer: มันไม่รองรับ Python 3 แม้ว่ามันอาจจะเป็นข้อผิดพลาด
jfs

7
@mkoistinen เป็นเครื่องมือที่ดี แต่จนกว่าจะรวมอยู่ใน PIP หมายถึงการติดตั้งสิ่งเพิ่มเติมที่ทุกคนไม่อาจต้องการที่จะทำ
Wernight

2
@Daniel: pip-tools ไม่ทำงานอีกต่อไป pip-review (fork ของ pip-tools) ทำงาน
jfs

7
pip-review ใช้งานได้ดี (อย่างน้อยสำหรับ Python เวอร์ชัน 3.5.0)
FredrikHedman

15
หากต้องการอัปเดตทั้งหมดโดยไม่มีโหมดโต้ตอบ:pip-review --local --auto
Dlamini

333

ทำงานบน Windows ควรทำเพื่อคนอื่นด้วย ($ เป็นไดเรกทอรีใดก็ตามที่คุณอยู่ในพร้อมรับคำสั่งเช่น C: / Users / ชื่อผู้ใช้>)

ทำ

$ pip freeze > requirements.txt

เปิดไฟล์ข้อความแทนที่==ด้วย>=และดำเนินการ

$ pip install -r requirements.txt --upgrade

หากคุณมีปัญหากับแพคเกจบางอย่างที่ทำให้การอัปเกรด (บางครั้งไม่จำเป็น) ให้ไปที่ไดเรกทอรี ($) ใส่ชื่อออก (เพิ่ม # ก่อนหน้า) และเรียกใช้การอัปเกรดอีกครั้ง คุณสามารถยกเลิกการใส่ข้อคิดเห็นในส่วนนั้นในภายหลัง สิ่งนี้ยังยอดเยี่ยมสำหรับการคัดลอกสภาพแวดล้อมของ python


อีกทางหนึ่ง:

ฉันชอบวิธีตรวจสอบ pip ด้วย:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

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

คุณสามารถเลือก 'a' เพื่ออัพเกรดแพ็คเกจทั้งหมด หากการอัพเกรดล้มเหลวให้รันอีกครั้งและดำเนินการต่อในการอัพเกรดถัดไป


29
คุณควรลบ'srequirements.txt =={version}ตัวอย่างเช่นpython-dateutil==2.4.2การpython-dateutilสำหรับทุกบรรทัด
youngminz

4
ฉันพบว่านี่ไม่ได้อัปเกรดแพ็กเกจบน macOS
jkooker

10
@youngminz ฉันจะแนะนำ 'แทนที่ทั้งหมด "=="> "> ="' ใน editor / ide ของคุณก่อนใช้งาน 'pip install ... ' เพื่อแก้ไขปัญหานี้
Amaury Liet

7
สำหรับ linux: $ pip freeze | cut -d '=' -f1> requirements.txtเพื่อที่จะลบรุ่น
Cavaz

1
หากเชลล์ที่คุณใช้คือทุบตีคุณสามารถย่อให้เป็นคำสั่งเดียวได้pip3 install -r <(pip3 freeze) --upgrade อย่างมีประสิทธิภาพ<(pip3 freeze)เป็น
ไพพ์ที่

128

รุ่นของ Windows หลังจากปรึกษาเอกสารที่ยอดเยี่ยมสำหรับFORโดย Rob van der Woude

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

19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i เร็วขึ้นเพราะจะลองและอัปเดตแพ็คเกจ "ล้าสมัย" เท่านั้น
Refael Ackermann

3
@RefaelAckermann ฉันสงสัยว่ามันจะช้ากว่าเดิม :) หากต้องการทราบว่าแพ็กเกจใดที่ล้าสมัยไปแล้วต้องตรวจสอบก่อนว่าอะไรเป็นเวอร์ชั่นล่าสุดของแต่ละแพ็คเกจ เหมือนกับขั้นตอนแรกเมื่อทำการอัปเดตและไม่ดำเนินการต่อหากไม่มีเวอร์ชันที่ใหม่กว่า อย่างไรก็ตามใน pip เวอร์ชันของคุณจะตรวจสอบเวอร์ชันสองครั้งครั้งแรกเพื่อสร้างรายการแพ็กเกจที่ล้าสมัยและครั้งที่สองเมื่ออัพเดตแพ็กเกจในรายการนี้
Piotr Dobrogost

2
@RefaelAckermann สปินอัพสปินอัพคือขนาดที่เร็วกว่าการตรวจสอบเวอร์ชั่นของแพ็กเกจผ่านเครือข่ายดังนั้นจึงเป็นจำนวนการตรวจสอบที่ควรปรับให้เหมาะสมไม่ใช่จำนวนสปินอัพ Mine ทำการตรวจสอบ n คุณทำเช็ค n + m
Piotr Dobrogost

2
+1 - มันคือ 6.20.2019 ฉันใช้ Python 3.7.3 ใน WIndows 10 และนี่เป็นวิธีที่ดีที่สุดสำหรับฉันในการอัปเดตแพ็คเกจท้องถิ่นทั้งหมดของฉัน
MacItaly

1
ต้องข้ามสองบรรทัดแรกของเอาต์พุต: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. หากมีการเรียกใช้จากไฟล์ชุดให้แน่ใจว่าจะใช้แทน%%i %iนอกจากนี้โปรดทราบว่าการอัปเดตpipก่อนใช้งานคำสั่งนี้จะpython -m pip install --upgrade pipปลอดภัยกว่า
Andy

126

ใช้pipupgrade !

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

pipupgradeช่วยให้คุณอัพเกรดระบบท้องถิ่นหรือแพ็คเกจจากrequirements.txtไฟล์ได้! นอกจากนี้ยังเลือกอัพเกรดแพ็คเกจที่ไม่ทำให้เกิดการเปลี่ยนแปลง pipupgrade ยังช่วยให้แน่ใจว่าจะอัพเกรดแพ็คเกจที่มีอยู่ในสภาพแวดล้อม Python หลาย ๆ เข้ากันได้กับ Python2.7 +, Python3.4 + และ pip9 +, pip10 +, pip18 +, pip19 +

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: ฉันเป็นผู้เขียนเครื่องมือ


1
วิธีการนี้มีการส่งออกมากสะอาดกว่าคำตอบของ @ RBP
Gaia

7
เป็นความคิดที่ดี แต่มันติดChecking...ตลอดไปเมื่อฉันลอง
CGFoX

1
เพิ่งติดตั้งและติดค้างที่การตรวจสอบ[0;93mChecking...[0m
Chris

1
@nandandrake สนใจที่จะเปิดปัญหาในหน้าปัญหาหรือไม่
Achilles Gasper Rasquinha

2
มีข้อผิดพลาดใน Windows 10 และ Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang

74

คุณสามารถพิมพ์แพ็คเกจที่ล้าสมัยได้

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

14
ภายใน virtualenv ฉันทำเช่นนี้:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard

ทุกวันนี้คุณสามารถทำได้ด้วยpython -m pip list outdated(แม้ว่าจะไม่ได้อยู่ในรูปแบบที่ต้องการ)
Jacktose

74

ตัวเลือกนี้ดูเหมือนจะตรงไปตรงมาและอ่านง่ายขึ้น:

pip install -U `pip list --outdated | awk 'NR>2 {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

ในคำสั่ง awk NR>2ข้ามสองระเบียนแรก (บรรทัด) และ{print $1}เลือกคำแรกของแต่ละบรรทัด (ตามคำแนะนำของ SergioAraujo ฉันลบtail -n +3ตั้งแต่awkสามารถจัดการกับการข้ามบันทึกได้)


หากการอัพเกรดล้มเหลวจะไม่มีการอัพเกรดเกิดขึ้น
บอริส

2
คุณสามารถหลีกเลี่ยงหางawk 'NR>2 {print $1}'ทำความสะอาดผลลัพธ์สำหรับคุณ
SergioAraujo

@SergioAraujo วิธีนี้ทำให้การแก้ปัญหาดูสะอาดขึ้นขอบคุณสำหรับเคล็ดลับ!
Marc

67

ซับในแบบต่อไปนี้อาจช่วยได้:

(pip> 20.0)

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

รุ่นเก่ากว่า:

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

xargs -n1 ยังคงดำเนินต่อไปหากเกิดข้อผิดพลาด

หากคุณต้องการการควบคุมที่ละเอียดยิ่งขึ้นสิ่งที่ถูกละเว้นและสิ่งที่ทำให้เกิดข้อผิดพลาดคุณไม่ควรเพิ่มการ-n1ตั้งค่าสถานะและกำหนดข้อผิดพลาดที่จะละเว้นอย่างชัดเจนโดย "piping" บรรทัดต่อไปนี้สำหรับแต่ละข้อผิดพลาดแยกต่างหาก:

| 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 ส่งคำเตือนไปยัง stdout :(
Chip Camden

ตกลงนี่เป็นธรรม: คุณสามารถเพิ่มได้มาก| sed 's/^<First characters of the error>.*//'เท่าที่ต้องการ ขอบคุณ!
raratiru

14
หรือ:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens

51

โซลูชันที่แข็งแกร่งยิ่งขึ้น

สำหรับ 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 เมื่อเดือนกรกฎาคม 2560 เรือพร้อมรุ่นเก่าที่เก่าแก่มาก (อายุสิบปี) หากต้องการรับนิพจน์ทั่วไปเพิ่มเติมให้ใช้ -E แทน -r ในโซลูชันด้านบน

การแก้ปัญหาด้วยวิธีแก้ปัญหายอดนิยม

โซลูชันนี้ได้รับการออกแบบและทดสอบเป็นอย่างดี1ในขณะที่มีปัญหาแม้แต่วิธีแก้ปัญหายอดนิยมที่สุด

  • ปัญหาการพกพาเนื่องจากการเปลี่ยนคุณสมบัติของบรรทัดคำสั่ง pip
  • การหยุดทำงานของ xargs เนื่องจากกระบวนการย่อย pip หรือ child ย่อยล้มเหลว
  • การบันทึกที่แออัดจากเอาต์พุต raw xargs
  • พึ่งพา Python-to-OS bridge ในขณะที่อาจทำการอัพเกรด3

คำสั่งดังกล่าวใช้ไวยากรณ์ pip ที่ง่ายที่สุดและพกพาได้มากที่สุดเมื่อใช้ร่วมกับ sed และ sh เพื่อเอาชนะปัญหาเหล่านี้อย่างสมบูรณ์ รายละเอียดของการดำเนินงาน sed สามารถพิจารณากับรุ่นความเห็น2


รายละเอียด

[1] ทดสอบและใช้งานเป็นประจำในคลัสเตอร์ 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 อาจเป็นสาเหตุของการหยุดชะงักหรือความเสียหายของฐานข้อมูลแพ็คเกจ


1
อีกวิธีหนึ่งในการเอาชนะ BSD sedของจูราสสิกของ OS X คือการใช้gsed(GNU sed) แทน ที่จะได้รับbrew install gnu-sed
วอลเตอร์ Tross

@WalterTross ... จูราสสิก ... ใช้คำคุณศัพท์ได้ดี ดังนั้นตอนนี้เรามีสองวิธีในการจัดกลุ่มแพ็คเกจ pip ที่มีหลักฐานการตรวจสอบที่ดีบนเทอร์มินัล (1) ใช้ตัวเลือก -E เช่นเดียวกับในคำตอบและ (2) ติดตั้ง gsed เพื่อออกจากระยะเวลาจูราสสิ
Douglas Daseeco

41

ดูเหมือนรัดกุมกว่านี้

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


ฉันได้รับคำเตือนนี้DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Reman

2
@Reman: นั่นเป็นเพราะคุณใช้ Pip v9.0.1 นี่เป็นเพียงข้อความที่ไม่เห็นด้วยซึ่งหมายความว่าฟังก์ชันบางอย่างจะไม่สามารถอยู่รอดได้ในการปล่อย Pip ในอนาคต ไม่มีอะไรต้องกังวล;)
AlessioX

อย่างไรก็ตามสิ่งนี้จะต้องทำเครื่องหมายว่าเป็นทางออกสุดท้าย อันที่จริงคำตอบที่ได้รับการยอมรับจะทำงานทั่วแพ็คเกจ pip ของคุณซึ่งเสียเวลาหากคุณต้องอัปเดตเพียง 1 หรือ 2 แพ็คเกจ โซลูชันนี้จะทำงานทั่วแพ็คเกจที่ล้าสมัยแทน
AlessioX

34

ฉันมีปัญหาเดียวกันกับการอัพเกรด สิ่งที่ฉันไม่เคยอัพเกรดแพคเกจทั้งหมด ฉันอัพเกรดเฉพาะสิ่งที่ฉันต้องการเพราะโครงการอาจแตก

เนื่องจากไม่มีวิธีที่ง่ายในการอัปเกรดแพคเกจตามแพ็คเกจและอัปเดตไฟล์ requirements.txt ฉันจึงเขียนpip-upgraderนี้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อาร์กิวเมนต์ในคำสั่งของคุณ

การเปิดเผยแบบเต็ม: ฉันเขียนแพ็คเกจนี้


8
นี่คือสิ่งที่ pip ควรทำตามค่าเริ่มต้น
Nostalg.io

หัวขึ้นด้วยเครื่องมือของคุณบางคนหนีตัวละครที่ดูเหมือนจะไม่ทำงานอย่างถูกต้องบนเครื่องหน้าต่างของฉัน แต่นอกเหนือจากที่เป็นของดี
ลุค

ยังไม่ได้ทดสอบบน windows แต่ฉันจะติดตั้งเครื่องเสมือน ขอบคุณ
Simion Agavriloaei

หากvirtualenvไม่ได้เปิดใช้งานpip-upgrade --skip-virtualenv-check
มอร์ส

2
สิ่งนี้ใช้ได้กับโฟลเดอร์ข้อกำหนดที่มีข้อกำหนดทั่วไปข้อกำหนดทั่วไปและปริมาณที่ต้องการ เยี่ยมมาก!
cwhisperer


27

รุ่นหนึ่งซับของ@ คำตอบของ

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

`


4
subprocess.call ("sudo pip install ... ในกรณีที่คุณต้องการสิทธิ์
Maximiliano Rios

4
@MaximilianoRios โปรดอย่าsudo pip installใช้virtual envแทน
Bengt

22

เมื่อใช้ virtualenv และถ้าคุณเพียงต้องการอัพเกรดแพ็คเกจที่เพิ่มเข้าไปใน virtualenv ของคุณคุณอาจต้องการ:

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

19

ทางออกที่ง่ายและเร็วที่สุดที่ฉันพบในการอภิปรายปัญหา pipคือ:

pip install pipdate
pipdate

ที่มา: https://github.com/pypa/pip/issues/3819


2
ในขณะที่โซลูชันอื่น ๆ จนตรอกเมื่อพบกับความผิดปกติเพียงเล็กน้อยโซลูชันนี้จะเตือนแล้วข้ามปัญหาเพื่อดำเนินการกับแพ็คเกจอื่นต่อไป ที่ดี!
Serge Stroobandt

18

โซลูชัน Windows Powershell

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

pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Foad

2
อาจpip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}จะเหมาะสมกว่า
ระดมสมอง

16

ใช้แพ็คอัพเดต awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

ปรับปรุง windows powershell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}


pip ตรึง | awk -F '[=]' '{พิมพ์ $ 1}' | xargs pip install -U
JohnDHH

และสำหรับไพ ธ อน 3 ... pip3 install -U $ (แช่แข็ง pip3 | awk -F '[=]' '{พิมพ์ $ 1}')
Jimmy MG Lim

12

คุณสามารถลองสิ่งนี้:

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

นี่เป็นวิธีที่สะอาดและอ่านได้สูงสุดในการอัพเดทแพ็คเกจ pip ในจำนวนที่สั้นที่สุด ยิ่งใหญ่
Mark Shust ที่ M.academy

12

ไข่แดงที่น่าทึ่งทำให้มันง่าย

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

มันสามารถทำสิ่งต่าง ๆ มากมายที่คุณอาจพบว่ามีประโยชน์


3
คำตอบของคุณได้รับการเปลี่ยนจากyolkการyolk3kคำตอบเดิมของคุณแน่นอนมีปัญหาเกี่ยวกับ python3
AXO

10

@ คำตอบของ Ramanaทำงานได้ดีที่สุดสำหรับฉันจากที่นี่ แต่ฉันต้องเพิ่มไม่กี่:

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ตรวจสอบไม่รวมแพคเกจการพัฒนาของฉันเพราะพวกเขาไม่ได้อยู่ในไดเรกทอรีระบบเว็บไซต์แพคเกจ ลองยกเว้นเพียงข้ามแพคเกจที่ถูกลบออกจาก PyPI

@endolith: ฉันหวังว่าจะเป็นเรื่องง่ายpip.install(dist.key, upgrade=True)เหมือนกัน แต่ดูเหมือนว่า pip จะไม่ถูกใช้กับสิ่งใดนอกจากบรรทัดคำสั่ง (เอกสารไม่ได้พูดถึง API ภายในและนักพัฒนา pip ไม่ได้ใช้ docstrings)


บน Ubuntu (และ Debian อนุพันธ์อื่น ๆ ) pipดูเหมือนว่าจะบรรจุภัณฑ์ใน/usr/local/lib/python2.7/dist-packagesหรือคล้ายกัน คุณสามารถใช้ '/ usr / local / lib /' แทน 'site-packages' ในifคำสั่งในกรณีนี้
drevicko

10

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

1
ขั้นตอนที่ 1: การติดตั้ง pip การอัปเกรด pip ล้าสมัยขั้นตอนที่ 2: การอัปเกรด Pip ล้าสมัย ... เรียบร้อยแล้ว
shao.lo

9

ที่ส่งผ่านดึงการร้องขอไปยังพื้นบ้าน pip ; ในระหว่างนี้ให้ใช้วิธีแก้ไขปัญหาของ pip library ที่ฉันเขียนไว้:

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

รุ่นที่มีการจัดการข้อผิดพลาด (ตามความคิดเห็น): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
ซามูเอลมาร์ค

9

ดูเหมือนว่าจะเหมาะกับฉัน ...

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

ฉันใช้printfช่องว่างหลังจากนั้นเพื่อแยกชื่อแพคเกจอย่างเหมาะสม


7

นี่เป็นโซลูชัน PowerShell สำหรับ Python 3:

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

และสำหรับ Python 2:

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

นี่เป็นการอัพเกรดแพ็คเกจหนึ่งต่อหนึ่ง ดังนั้น

pip3 check
pip2 check

หลังจากนั้นควรตรวจสอบให้แน่ใจว่าไม่มีการอ้างอิงใด ๆ ที่ใช้งานไม่ได้



7

สั้นที่สุดและง่ายที่สุดบน Windows

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

@Enkouyami บน windows 7 คำสั่งนี้ใช้ไม่ได้หากไม่มี -r -r ต้องตัดเส้นทางไปยังไฟล์ข้อกำหนด
Chockomonkey


6

สิ่งนี้มีประสิทธิภาพมากกว่านี้หรือไม่

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จับคู่ inverted 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 รับ 1 อาร์กิวเมนต์จากไพพ์ซ้ายของมันและส่งผ่านไปยังคำสั่งเพื่ออัพเกรดรายการแพ็กเกจ

นี่คือผลลัพธ์ของฉัน: kerberos iwlib PyYAML Could pygpgme Could Could Could ...โปรดสังเกต "s" ทั้งหมด ต้นกำเนิดมาจากผลลัพธ์ของpip list -o"ไม่พบการดาวน์โหลดใด ๆ ที่ตรงตามข้อกำหนด <package>"
DrStrangepork

คุณสามารถวางเอาท์พุตของpip list -o?
Alex V

ความคิดเห็นไม่ดีในรูปแบบนี้ แต่นี่เป็นตัวอย่าง (จุดสิ้นสุดของบรรทัดถูกทำเครื่องหมายด้วย ';'):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
DrStrangepork

pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") แทนการกรองทุกบรรทัดซึ่งไม่ควรนำมาใช้ผมจะแนะนำในการกรองสายที่มีการปรับปรุงอยู่: ไม่เช่นนั้นคุณอาจพลาดได้ง่ายๆหนึ่งบรรทัดที่คุณไม่ต้องการและรับผลลัพธ์ที่ DrStrangeprk พูดถึง
antibus

ฉันอยากจะแนะนำให้ใช้xargsแทน pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -Uการ-rตั้งค่าสถานะทำให้แน่ใจได้ว่าpip install -Uจะไม่ถูกเรียกใช้หากไม่มีแพ็กเกจที่ล้าสมัย การ-pตั้งค่าสถานะพร้อมท์ให้ผู้ใช้ยืนยันก่อนดำเนินการคำสั่งใด ๆ คุณสามารถเพิ่มการ-n1ตั้งค่าสถานะเพื่อให้พร้อมท์คุณก่อนที่จะติดตั้งแต่ละแพคเกจแยกต่างหาก
หก

6

หนึ่งบรรทัดใน PowerShell 5.1 ที่มีสิทธิ์ผู้ดูแลระบบ, Python 3.6.5 และ pip ​​ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

มันทำงานได้อย่างราบรื่นหากไม่มีแพ็คเกจที่ขาดหรือล้อพิเศษในรายการ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.