งูใหญ่อัพเดทแพ็คเกจที่เป็นไปได้ทั้งหมดหรือไม่


151

ฉันได้ลองconda search --outdatedแล้วมันมีแพ็คเกจที่ล้าสมัยมากมายเช่น scipy คือ 0.17.1 แต่ล่าสุดคือ 0.18.0 conda update --allแต่เมื่อฉันทำ มันจะไม่อัปเดตแพ็คเกจใด ๆ

อัปเดต 1

conda update --all --alt-hint

Fetching package metadata .......
Solving package specifications: ..........

# All requested packages already installed.
# packages in environment at /home/user/opt/anaconda2:
#

อัปเดต 2

ฉันสามารถอัพเดตแพ็คเกจเหล่านี้แยกกัน conda update scipyฉันจะทำ แต่ทำไมฉันไม่สามารถอัปเดตทั้งหมดในคราวเดียวได้


2
อาจเป็นเพราะกลุ่มคนล่าสุดมีการพึ่งพาที่ขัดแย้งกัน ตัวอย่างเช่นอาจต้องใช้ NumPy 1.11 แต่คุณมีแพ็คเกจอื่นที่ต้องใช้ NumPy 1.10 คุณสามารถลองconda update --all --alt-hintและดูว่ามันจะช่วยให้การส่งออกใด ๆ ... หรือเพียงแค่พยายามconda update scipyและดูสิ่งที่เกิดขึ้น (บางทีกับ--alt-hintธง)
darthbith

@darthbith โปรดอ้างอิงถึงการอัปเดต 1. ไม่มีข้อมูลที่เป็นประโยชน์
วัง

1
But why I cannot update all of them in one go?อาจเป็นเพราะคุณมีแพ็คเกจอย่างน้อยหนึ่งแพ็คเกจที่ขึ้นอยู่กับรุ่นที่เก่ากว่าและไม่มีสิ่งใดที่สามารถอัปเดตได้
cel

เป็นไปได้หรือไม่ที่จะรู้ว่าอันไหนขึ้นอยู่กับแพ็คเกจเก่า?
วัง

3
ฉันแนะนำให้ใช้conda update condaก่อนconda update --all
gizzmole

คำตอบ:


230

TL; DR: ข้อขัดแย้งในการพึ่งพา: การอัปเดตสิ่งที่จำเป็น (โดยเป็นข้อกำหนด)เพื่อปรับลดรุ่นอื่น

คุณพูดถูก

conda update --all

เป็นจริงวิธีที่จะไป1 Conda พยายามอัพเกรดแพ็คเกจเป็นเวอร์ชั่นใหม่ล่าสุดในซีรีย์เสมอ (เช่น Python 2.x หรือ 3.x)

ข้อขัดแย้งในการพึ่งพา

แต่เป็นไปได้ว่ามีความขัดแย้งในการพึ่งพา (ซึ่งป้องกันการอัพเกรดเพิ่มเติม) Conda มักจะเตือนอย่างชัดเจนหากเกิดขึ้น

เช่น X ต้องการ Y <5.0 ดังนั้น Y จะไม่เป็น> = 5.0

นั่นเป็นเหตุผลที่คุณไม่สามารถอัพเกรดได้ทั้งหมด

การตัดสินใจ

วิธีเพิ่ม: อาจใช้งานได้ แต่ X เวอร์ชันใหม่ที่ทำงานกับ Y> 5.0 ไม่สามารถใช้งานได้ใน conda เป็นไปได้ที่จะติดตั้งด้วย pip เนื่องจากแพ็คเกจเพิ่มเติมมีอยู่ใน pip แต่โปรดทราบว่า pip ยังติดตั้งแพ็กเกจหากมีข้อขัดแย้งในการพึ่งพาและมักจะทำให้สภาพแวดล้อมของคุณแตกในแง่ที่ว่าคุณไม่สามารถติดตั้งกับ conda ได้อีกต่อไป ถ้าคุณทำเช่นนั้นทำมันเป็นทางเลือกสุดท้ายและหลังจากแพคเกจทั้งหมดได้รับการติดตั้งด้วย conda มันค่อนข้างแฮ็ค

วิธีที่ปลอดภัยคุณสามารถลองคือการเพิ่มCONDA-ปลอมเป็นช่องทางเมื่ออัพเกรด (เพิ่ม-c conda-forgeเป็นธง) หรือช่องทางอื่น ๆ ที่คุณพบว่ามีแพคเกจของคุณถ้าคุณต้องการรุ่นใหม่นี้จริงๆ วิธีนี้ conda จะค้นหาแพคเกจที่มีอยู่ในสถานที่นี้ด้วย

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

X> 2.0 ต้องการ Y <5.0, X <2.0 ต้องการ Y> 5.0

ดังนั้นการอัพเกรด Y> 5.0 หมายถึงการลดระดับ X เป็น <2.0 และในทางกลับกัน

( นี่เป็นตัวอย่างการสอนแน่นอน แต่มันเหมือนกันในความเป็นจริงโดยปกติแล้วจะมีการพึ่งพาที่ซับซ้อนมากขึ้นและการพึ่งพาย่อย )

ดังนั้นคุณยังคงไม่สามารถอัปเกรดได้ทั้งหมดโดยทำการอัปเกรดแยกต่างหาก การพึ่งพานั้นไม่น่าพอใจดังนั้นก่อนหน้านี้หรือหลังจากนั้นการอัปเกรดจะลดระดับแพ็คเกจที่อัปเกรดแล้วอีกครั้ง หรือทำลายความเข้ากันได้ของแพ็กเกจ (ซึ่งโดยปกติคุณไม่ต้องการ!) ซึ่งเป็นไปได้โดยการเรียกการเพิกเฉยต่อการพึ่งพาและคำสั่งบังคับอย่างชัดเจน แต่นั่นเป็นเพียงการแฮ็กปัญหาของคุณไม่ใช่กรณีผู้ใช้ปกติ!


1หากคุณต้องการอัปเดตแพคเกจการติดตั้งซึ่งโดยปกติคุณไม่ต้องการ คำสั่งที่รันในสภาพแวดล้อมพื้นฐานจะอัพเดตแพ็กเกจในสิ่งนี้ แต่โดยปกติคุณควรทำงานกับสภาพแวดล้อมเสมือน ( conda create -n myenvและจากนั้นconda activate myenv) การดำเนินการconda update --allภายในสภาพแวดล้อมดังกล่าวจะอัพเดตแพ็คเกจภายในสภาพแวดล้อมนี้ อย่างไรก็ตามเนื่องจากสภาพแวดล้อมพื้นฐานยังเป็นสภาพแวดล้อมคำตอบจึงใช้กับทั้งสองกรณีด้วยวิธีเดียวกัน


1
หากคุณกำลังใช้ conda อย่าทำลายสภาพแวดล้อมของคุณเมื่อคุณเขียนทับด้วย pip! หากใช้สภาพแวดล้อมของ Data Science อย่าติดตั้ง pkgs isolated เพราะคุณมีโอกาสมากขึ้นที่จะใช้ pip เพื่อทำลาย env ของคุณ
กฎหมาย

1
ฉันเห็นด้วยการใช้ pip ทำให้ conda ไม่สามารถทำงานได้อย่างน่าเชื่อถืออีกต่อไป ฉันได้เพิ่มสิ่งนี้ลงในคำตอบอย่างชัดเจน
Mayou36

15

หากต้องการตอบคำถามให้แม่นยำยิ่งขึ้น:

conda (ซึ่งเป็น conda สำหรับ miniconda สำหรับ Anaconda) จะอัปเดตทั้งหมด แต่เฉพาะภายในแพ็คเกจรุ่น -> major และ minor นั่นคือกระบวนทัศน์

ในเอกสารคุณจะพบ "หมายเหตุ: การอัปเดต Conda เป็นรุ่นที่สูงที่สุดในซีรีส์ดังนั้น Python 2.7 จะอัปเดตเป็นรุ่นสูงสุดที่มีให้ในซีรีย์ 2.x และการอัปเดต 3.6 เป็นเวอร์ชั่นสูงสุดในซีรีย์ 3.x" คุณหมอ

หากวังไม่ได้ยกตัวอย่างที่ทำซ้ำได้ใครสามารถช่วยได้ เช่นมันเป็นสภาพแวดล้อมเสมือนจริงที่เขาต้องการอัปเดตหรือสามารถรับสิ่งที่เขาต้องการได้

conda update -n ENVIRONMENT --all

* โปรดอ่านเอกสารก่อนใช้งาน "update --all"! สิ่งนี้ไม่ได้นำไปสู่การอัพเดทแพ็คเกจทั้งหมดตามธรรมชาติ เนื่องจาก conda พยายามแก้ไขความสัมพันธ์ของการพึ่งพาระหว่างแพ็กเกจทั้งหมดในสภาพแวดล้อมของคุณสิ่งนี้สามารถนำไปสู่แพ็คเกจ DOWNGRADED โดยไม่มีคำเตือน


หากคุณต้องการอัปเดตเกือบทั้งหมดคุณสามารถสร้างไฟล์พินได้

echo "conda ==4.0.0" >> ~/miniconda3/envs/py35/conda-meta/pinned
echo "numpy 1.7.*" >> ~/miniconda3/envs/py35/conda-meta/pinned

ก่อนเรียกใช้การอัปเดต

หากภายหลังคุณต้องการละเว้นไฟล์ใน env ของคุณสำหรับการอัพเดตคุณสามารถทำได้:

conda update --all --no-pin

คุณไม่ควรทำการอัพเดท - ทั้งหมด หากคุณต้องการอย่างไรก็ตามคุณสามารถทดสอบสิ่งนี้ในสภาพแวดล้อมแบบโคลน

ขั้นตอนแรกควรสำรองข้อมูลจำเพาะปัจจุบันของคุณเสมอ:

conda list -n py35 --explicit 

(แต่ถึงกระนั้นก็ยังไม่ได้มีการเชื่อมโยงไปยังแหล่งที่มีอยู่เสมอ - เช่น jupyterlab ส่วนขยาย)

ถัดไปคุณสามารถโคลนและอัปเดต:

conda create -n py356 --clone py35

conda activate py356
conda config --set pip_interop_enabled True # for conda>=4.6
conda update --all

กำหนดค่า conda


อัปเดต:

เพราะความคิดของ conda นั้นดี แต่มันก็ไม่ได้ผลดีมากสำหรับสภาพแวดล้อมที่ซับซ้อนฉันเองชอบการรวมกันของnix-shell (or lorri) and poetry[เป็น pip ที่ดีกว่า / conda .-)] ( บทนำ poetry2nix )


สุดท้ายหากคุณต้องการจริงๆที่จะทำงานร่วมกับแพคเกจที่เข้ากันไม่ได้เกิดจากการอ้างอิงของมันก็เป็นไปได้ด้วยเทคโนโลยีเช่นNixOS / ระวัง-pkgs


3
คำตอบนี้จะถือว่า: 1. คุณติดตั้ง miniconda3 ด้วยชื่อและพา ธ เริ่มต้น (ไม่ใช่แอนคอนดา) 2. คุณสร้างสภาพแวดล้อม "py35" คุณอาจระบุเพิ่มเติมว่าในฐานะผู้เริ่มต้นซึ่งคำตอบนี้ควรตั้งเป้าหมายไว้ที่ (ในความคิดของฉัน) อาจสับสนได้ง่าย นอกจากนี้คุณตะเข็บไม่ได้จริงๆที่จะตอบคำถามเช่นนี้อาจยังคงไม่อนุญาตให้เขาในการอัพเกรด และนั่นคือเป้าหมายของเขา
Mayou36

แน่นอนให้ฉันถามพวกเขาที: a) "เฉพาะภายในรุ่นที่ระบุ": นี่หมายถึงรุ่น Python ไม่ใช่แพ็คเกจใช่มั้ย? หรือคุณสามารถอ้างอิงได้โปรด
Mayou36

b) "ในเอกสารคุณจะพบ [... ]": นี่หมายถึงรุ่นงูหลามอย่างชัดเจน มันไม่เกี่ยวอะไรกับคำถามใช่ไหม? หรือทำไมคุณโพสต์นี้ คำสั่งนี้เกี่ยวข้องกันอย่างไร?
Mayou36

c) conda update -n ENVIRONMENT --all: ฉันยอมรับว่านี่คือสิ่งที่เขา / เธอมักจะต้องการใช้ไม่ใช่เพื่ออัปเดตสภาพแวดล้อมพื้นฐาน อย่างไรก็ตามฉันไม่พบคำอธิบายในคำตอบของคุณเกี่ยวกับเรื่องนี้ทั้งหมดมันเป็นเพียงการเขียนและไม่ได้อ้างถึงความแตกต่างของการใช้คำสั่งของ op ในสภาพแวดล้อมพื้นฐาน
Mayou36

d) "หากคุณต้องการอัปเดตเกือบทั้งหมดคุณสามารถสร้างไฟล์พิน": นี่เป็นข้อมูลที่ดี แต่มันไม่ใช่สิ่งที่ OP ขอ เขาต้องการที่จะรู้ว่าทำไมเขาไม่สามารถอัปเดตทั้งหมด เขาไม่ต้องการที่จะปักหมุดรุ่น ดังนั้นมันไม่ได้เพิ่มคำตอบใช่ไหม?
Mayou36

2

ลองนึกภาพกราฟการพึ่งพาของแพ็กเกจเมื่อจำนวนแพ็คเกจเพิ่มขึ้นมากโอกาสที่จะเกิดข้อขัดแย้งเมื่ออัพเกรด / เพิ่มแพ็กเกจจะสูงกว่ามาก เพื่อหลีกเลี่ยงปัญหานี้เพียงแค่สร้างสภาพแวดล้อมใหม่ใน Anaconda

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

  • หมีแพนด้า
  • scikit เรียนรู้
  • matplotlib
  • สมุดบันทึก
  • keras

และฉันมีทั้งหมด 84 แพ็กเกจ


สิ่งนี้ไม่ตอบคำถามเกี่ยวกับวิธีอัปเกรดแพ็คเกจเฉพาะ
Mayou36

0

ถ้าทำงานใน MS windows คุณสามารถใช้ Anaconda navigator คลิกที่สภาพแวดล้อมในช่องแบบเลื่อนลงจะมีการ "ติดตั้ง" ตามค่าเริ่มต้น คุณสามารถเลือก "อัพเดทได้" และเริ่มจากตรงนั้น


1
แต่คุณจะเลือกทั้งหมดเพื่ออัปเดตเมื่อมีการเลือกทีละมากเกินไปได้อย่างไร
beldaz

@beldaz ฉันพยายาม 'แก้ปัญหา' โดยเลือกแพ็คเกจทั้งหมด 141 รายการในคอลัมน์สุดท้ายด้วย 'เวอร์ชัน' จากนั้นกดใช้ ไม่แน่ใจว่าทำงานได้หรือไม่ :( จากนั้นฉันเพิ่งเปิดคอนโซล Anaconda โดยกด <win> Anaconda Prompt
Pieter21

เรียกใช้ในฐานะผู้ดูแลระบบอาจต้องใช้ด้วย
Pieter21

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

-1

เพื่ออัปเดตแพ็คเกจที่เป็นไปได้ทั้งหมดที่ฉันใช้ conda update --update-all

มันได้ผล!


4
ไม่มันไม่ใช่ "ไม่": ถ้าคุณอ่าน OP ใหม่จะพบข้อขัดแย้งในการพึ่งพา คำตอบนี้ไม่ได้แก้หรืออธิบายอะไร
Mayou36

-6

ฉันจะแก้ไขปัญหานี้ด้วยและcondapip

ตอนแรกฉันวิ่ง:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

หลังจากนั้นฉันเปิด cmd และเรียกใช้รหัสนี้

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

สุดท้ายคุณควรติดตั้งmatplotlibใน pip ด้วยรหัสนี้ว่าpip install matplotlib


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