อัพเกรดแพ็คเกจ python จาก requirements.txt โดยใช้คำสั่ง pip


113

ฉันจะอัพเกรดแพ็คเกจ python ทั้งหมดของฉันจากไฟล์ requirements.txt โดยใช้คำสั่ง pip ได้อย่างไร

พยายามด้วยคำสั่งด้านล่าง

$ pip install --upgrade -r requirements.txt

เนื่องจากแพคเกจ python ต่อท้ายด้วยหมายเลขเวอร์ชัน ( Django==1.5.1) ดูเหมือนจะไม่อัปเกรด มีแนวทางใดที่ดีไปกว่าการแก้ไขไฟล์ requirements.txt ด้วยตนเองหรือไม่?

แก้ไข

ดังที่แอนดี้กล่าวไว้ในแพ็กเกจคำตอบของเขาถูกตรึงไว้ที่เวอร์ชันเฉพาะดังนั้นจึงไม่สามารถอัปเกรดแพ็คเกจผ่านคำสั่ง pip ได้

แต่เราสามารถทำได้pip-toolsโดยใช้คำสั่งต่อไปนี้

$ pip-review --auto

สิ่งนี้จะอัปเกรดแพ็คเกจทั้งหมดโดยอัตโนมัติจาก requirements.txt (ตรวจสอบให้แน่ใจว่าได้ติดตั้งpip-toolsโดยใช้คำสั่ง pip install)


7
Pip-เครื่องมือคือการทำงานที่ดี - pip-compile -U requirements.txtไวยากรณ์การปรับปรุงคือ
erikreed

คำตอบ:


41

ไม่ไฟล์ข้อกำหนดของคุณถูกตรึงไว้กับเวอร์ชันที่ระบุ หากข้อกำหนดของคุณถูกตั้งค่าเป็นเวอร์ชันนั้นคุณไม่ควรพยายามอัปเกรดเกินเวอร์ชันเหล่านั้น หากคุณต้องการอัปเกรดคุณจะต้องเปลี่ยนไปใช้เวอร์ชันที่ไม่ได้ตรึงในไฟล์ข้อกำหนดของคุณ

ตัวอย่าง:

lxml>=2.2.0

สิ่งนี้จะอัปเกรด lxml เป็นเวอร์ชันที่ใหม่กว่า 2.2.0

lxml>=2.2.0,<2.3.0

สิ่งนี้จะอัปเกรด lxml เป็นเวอร์ชันล่าสุดระหว่าง 2.2.0 ถึง 2.3.0


2
ฉันพบว่ามีประโยชน์ในการทำสิ่งต่อไปนี้ 1. ลบ venv 2. สร้างอันใหม่โดยใช้ชื่อเดียวกัน (วิธีทำความสะอาดแพ็คเกจ pip ทั้งหมด) 3. แทนที่ทั้งหมด == เป็น> = ใน requirements.txt 4. pip install -r requirements.txt 4.
zhukovgreen

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt จะแทนที่ทั้งหมด==ด้วย>=
philshem

80

ฉันตอบคำถามนี้ที่นี่แล้ว นี่คือวิธีแก้ปัญหาของฉัน:

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

การเปิดเผยข้อมูลทั้งหมด: ฉันเขียนแพ็คเกจนี้


5
เยี่ยมมาก! น่าแปลกใจที่ฟังก์ชั่นดังกล่าวไม่มีอยู่ใน pip โดยตรง
Jacopofar

5
สวยหรู! ดีใจสุด ๆ ที่เลื่อนลงมาที่นี่: P
PulseJet

3
ฉันเพิ่งใช้สิ่งนี้และนี่เป็นสิ่งที่ดีที่สุดตั้งแต่ f-strings
Pierre.Sassoulas

1
เครื่องมือที่ยอดเยี่ยม ขอบคุณ.
mszaro

เครื่องมือที่มีประโยชน์มาก! ฉันยังพบแพ็คเกจอื่นที่เรียกว่าpurซึ่งอัปเกรดเวอร์ชันที่ตรึงไว้เช่นกัน
Gal Avineri

80

คุณสามารถลอง:

pip install --upgrade --force-reinstall -r requirements.txt

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

pip install --ignore-installed -r requirements.txt

2
ด้วยตัวเลือกนั้นดูเหมือนว่าจะติดตั้งเวอร์ชันเดิมอีกครั้ง ดังที่แอนดี้ได้กล่าวไว้ในคำตอบข้างต้นแพ็กเกจจะถูกตรึงไว้ที่เวอร์ชันเฉพาะ
abhiomkar

@abhiomkar คุณเป็นคนสำคัญฉันคิดว่าคุณต้องการติดตั้งเวอร์ชันเดิมอีกครั้ง (อาจจะเพิ่ม backport fix)
Freelancer

1
คำสั่งที่สองคือสิ่งที่ฉันกำลังมองหา สังเกตว่า-Iและ--ignore-installedเป็นแฟล็กเดียวกันและแน่นอนว่ามันไม่ถูกต้องที่จะมี,อยู่ในนั้น pip-review --autoวิธีนี้ไม่ปรับลดจะเกิดขึ้นในระหว่างการติดตั้งและหลังการติดตั้งของความต้องการเป็นหนึ่งในที่สมบูรณ์สามารถอัพเกรดแพคเกจติดตั้งโดยใช้
AXO

4

ผมขอแนะนำให้แช่แข็งทั้งหมดของการอ้างอิงของคุณเพื่อให้มีการคาดเดาได้สร้างคาดเดาได้สร้าง

เมื่อทำเช่นนั้นคุณสามารถอัปเดตการอ้างอิงทั้งหมดพร้อมกันได้ดังนี้:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

มีการกระทำดังกล่าวข้างต้นทดสอบโครงการของคุณด้วยชุดใหม่ของแพคเกจและในที่สุดก็กระทำrequirements.txtไฟล์ไปยังพื้นที่เก็บข้อมูล


3

ฉันก็ต้องทำเหมือนกัน ... ใช้ซับในขนาดเล็กนี้เพื่อทำงาน:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

ที่:

  • packages=$(cat requirements.txt | sed 's/==.*//g') สร้างรายการชื่อแพ็กเกจปัจจุบันใน requirements.txt (การลบเวอร์ชัน)
  • echo $packages | xargs pip3 install -U จากนั้นส่งแพ็กเกจทั้งหมดเป็นอาร์กิวเมนต์ไปยัง pip3 เพื่ออัปเกรด
  • freeze=$(pip3 freeze); รับเวอร์ชันแพ็กเกจปัจจุบันทั้งหมดในรูปแบบที่จำเป็นสำหรับ requirements.txt
  • for p in $(echo $packages) จากนั้นวนซ้ำผ่านชื่อแพ็กเกจ
    • echo $freeze | grep -E "^${p}==" >> requirements.new รับบรรทัดเวอร์ชันแพ็กเกจจากเอาต์พุต pip freeze ซึ่งตรงกับแพ็กเกจและเขียนไปยัง new requirements.txt

สิ่งนี้มีประโยชน์เพิ่มเติมในการรักษาการจัดลำดับของข้อกำหนดเดิม txt :)

หวังว่านี่จะช่วยได้!


2

เนื่องจากฉันไม่สามารถทำได้โดยใช้ bash ฉันจึงเขียนโมดูล python เพื่อสร้างไฟล์ข้อกำหนดใหม่ที่ไม่มีเวอร์ชันและใช้มัน:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

จากนั้นติดตั้ง libs จากไฟล์ใหม่ pip install -U -r requirements-prod-no-version.pip

สุดท้ายตรึงเวอร์ชันไว้ในไฟล์ต้นฉบับ pip freeze > requirements-prod.pip


2

อีกวิธีหนึ่งคือการใช้แพ็คเกจข้อกำหนดในการอัพเกรด

pip install upgrade-requirements

แล้วเรียกใช้:

upgrade-requirements

จะอัปเกรดแพ็คเกจทั้งหมดที่ไม่ได้อยู่ในเวอร์ชันล่าสุดและยังสร้างข้อกำหนดที่ปรับปรุงแล้วในตอนท้าย


0
  • 1) ในการอัปเกรดไฟล์ที่ติดตั้ง pip จากreqs.txt ให้ เพิ่ม> =ในการแทนที่== สิ่งนี้จะบอกให้ pip ติดตั้งlibมากกว่าหรือเท่ากับเวอร์ชันที่คุณร้องขอที่นี่โดยการติดตั้งไลบรารีที่ร้องขอเวอร์ชันล่าสุด

    1. a) ** คำตอบของฉันสำหรับเธรด ** โดยการเพิ่มpy -m pip install -r reqs.txtเพื่อรีสตาร์ททุกวัน ... หรือบางอย่างในลักษณะที่คุณสามารถอัปเดต libs ที่ติดตั้งไว้ได้ สรุปโดย Andy อย่างสมบูรณ์แบบ

    - เหตุผลของฉันในการเข้าสู่เธรดนี้คือเพื่อค้นหาข้อมูลเกี่ยวกับวิธีการอัปเดต virtual env base pip (โดยปกติคือ 10.0.03 สำหรับฉัน ??)

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

ก. การสร้างVenv || B. การติดตั้ง libs ที่จำเป็น

ขอบคุณแอนดี้ฉันพอใจกับความต้องการบี

โดยการเพิ่ม pip > = เวอร์ชันที่ร้องขอในreqs.txt

เมื่อสร้างอินสแตนซ์ของสภาพแวดล้อมเสมือนใหม่ || การสร้างอินสแตนซ์ใหม่ของ Venv ก่อนหน้านี้

  1. py -m venv devenv

เพื่อตั้งค่า dev env ใหม่

  1. evenv\scripts\activate.bat

เพื่อเปิดใช้งาน dev env

  1. python -m pip install -r requirenments.txt

เพื่อติดตั้งฐาน libs

เอาท์พุท Yeilds

การรวบรวม pip > = 20.0.2 (จาก -r requirenments.txt (บรรทัดที่ 1)) โดยใช้แคช> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3 ไม่มี - ใด ๆ . wl

พบการติดตั้งที่มีอยู่: pip 10.0.1

การถอนการติดตั้ง pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

ขออภัยสำหรับ Brain Dump หวังว่านี่จะช่วยใครสักคน :)

🤳ออสติน 👨‍🎤🚀🥊


0

คำตอบที่สองมีประโยชน์ที่สุด แต่สิ่งที่ฉันต้องการทำคือล็อกแพ็คเกจบางอย่างในขณะที่มีคนอื่นเป็นเวอร์ชันล่าสุด (เช่น youtube-dl)

ตัวอย่างrequirements.txtจะมีลักษณะดังนี้ (~ หมายถึงเข้ากันได้):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

จากนั้นในเทอร์มินัลให้ใช้คำสั่ง pip install --upgrade -r requirements.txt

เพื่อให้แน่ใจว่า Pillow จะอยู่ที่ 6.2.2 คำขอจะได้รับการอัปเกรดเป็น 2.22.x ล่าสุด (ถ้ามี) และ youtube-dl เวอร์ชันล่าสุดจะได้รับการติดตั้งหากยังไม่ได้ดำเนินการ



-1

หากคุณติดตั้งสิ่งใด ๆ ในโปรเจ็กต์ django ของคุณและหลังการติดตั้งคุณต้องการอัพเดตไฟล์ความต้องการของคุณคำสั่งนี้สามารถอัปเดตไฟล์ Requ.txt ให้คุณ pip freeze> requirements.txt

หากไฟล์ความต้องการของคุณไม่มีอยู่ในโปรเจ็กต์ของคุณคุณสามารถใช้คำสั่งนี้เพื่อสร้างไฟล์ความต้องการใหม่ pip freeze> requirements.txt


นี่เป็นความคิดที่ไม่ดีเนื่องจากจะเพิ่มข้อกำหนดของความต้องการทั้งหมดของคุณส่งผลให้ไฟล์ข้อกำหนดมีขนาดใหญ่โดยไม่จำเป็น หากคุณตัดสินใจที่จะอัปเดตการอ้างอิงเพียงครั้งเดียวคุณมีแนวโน้มที่จะได้รับความขัดแย้งของเวอร์ชันเว้นแต่คุณจะทราบว่ามีการเพิ่มข้อกำหนดอื่นใดในไฟล์ข้อกำหนดของคุณเนื่องจากแพ็กเกจนั้น
จลาจล

-10

ฉันแก้ไข Requirement.txt ด้านล่างและเรียกใช้ $ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;

3
นี่เป็นตัวอย่างในอุดมคติของการต่อต้านรูปแบบ มีอะไรผิดปกติที่นี่: 1) ข้อกำหนด. txt เป็นไฟล์. txt แต่คุณได้ทำให้มันสามารถเรียกใช้งานได้ 2) มีคำสั่ง pip install -r requirements.txt อย่างง่าย ดังนั้นคุณสามารถใช้ไฟล์ requirements.txt เพื่อแสดงรายการการอ้างอิงโครงการของคุณเท่านั้น 3) คุณไม่ได้ใช้แพ็คเกจเวอร์ชันต่างๆ 4) ไม่ใช่รูปแบบทั่วไปนักพัฒนารายอื่นไม่ได้ทำอะไรเกี่ยวกับวิธีการใช้งาน 5) ใช้กับท่อ CI / CD ยาก โปรดอย่าใช้ตัวอย่างนี้
Fannigurt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.