Conda ใช้แทน virtualenv หรือไม่


205

ฉันเพิ่งค้นพบCondaหลังจากฉันประสบปัญหาในการติดตั้ง SciPy โดยเฉพาะในแอพ Heroku ที่ฉันกำลังพัฒนา

ด้วย Conda คุณสร้างสภาพแวดล้อมที่คล้ายกันมากกับสิ่งที่virtualenvไม่ คำถามของฉันคือ:

  1. หากฉันใช้ Conda จะต้องใช้ virtualenv แทนหรือไม่ ถ้าไม่ฉันจะใช้ทั้งสองร่วมกันได้อย่างไร ฉันจะติดตั้ง virtualenv ใน Conda หรือ Conda ใน virtualenv หรือไม่
  2. ฉันยังต้องใช้ pip หรือไม่? ถ้าเป็นเช่นนั้นฉันจะยังสามารถติดตั้งแพ็คเกจด้วย pip ในสภาพแวดล้อมที่แยกได้หรือไม่

หากคุณสนใจใช้ conda และ pip ​​บน Heroku ให้ดูตัวอย่างgithub.com/faph/conda-pip-buildpack
faph

ขอบคุณ ฉันสังเกตเห็นว่ามีถุงเก็บน้ำสำหรับ Heroku บน github ค่อนข้างมาก ฉันควรคำนึงถึงปัจจัยใดบ้างเมื่อตัดสินใจว่าจะใช้ buildpack แบบใด
Kritz

โปรดทราบว่าคุณยังคงต้องใช้ pip หากคุณต้องการติดตั้งแพ็คเกจที่ไม่สามารถใช้งานได้โดยตรงจากเซิร์ฟเวอร์ของ Continuum
ali_m

ใช่ฉันเห็นว่าพวกเขายังอยู่ใน Django 1.8 (ไม่ใช่ 1.9) ในตอนนี้ฉันจะใช้ conda ที่จำเป็น (scipy and numpy) และ pip ​​สำหรับทุกอย่าง - แต่ยังอยู่ใน conda
Kritz

ส่วนใหญ่ Herpacks buildoku Heroku นั้นมาจาก Kenneth Reitz ฉันคิดว่า กับคนที่ปรับแต่งพวกเขาเพื่อให้เหมาะกับความต้องการของพวกเขา เพียงตรวจสอบว่าพวกเขามีทั้งการสนับสนุน conda และ pip ​​หากนั่นคือสิ่งที่คุณต้องการ และหากพวกเขาสนับสนุนไฟล์ environment.yml คุณสามารถดูรหัส buildpack ได้อย่างรวดเร็วเพื่อดูว่าคุณชอบสคริปต์การสร้างหรือไม่ตัวอย่างเช่นเพื่อดูว่าสภาพแวดล้อมนั้นถูกสร้างขึ้นอย่างแน่นอน
faph

คำตอบ:


157
  1. Conda แทนที่ virtualenv ในความคิดของฉันมันจะดีกว่า ไม่ จำกัด Python แต่สามารถใช้กับภาษาอื่นได้เช่นกัน จากประสบการณ์ของฉันมันให้ประสบการณ์ที่นุ่มนวลกว่ามากโดยเฉพาะกับแพ็คเกจทางวิทยาศาสตร์ เวลาแรกที่ผมได้ติดตั้งอย่างถูก Mayavi บน Mac condaกับ

  2. pipคุณยังสามารถใช้ ที่จริงแล้วการcondaติดตั้งpipในแต่ละสภาพแวดล้อมใหม่ รู้เกี่ยวกับแพ็คเกจที่ติดตั้ง pip

ตัวอย่างเช่น:

conda list

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

sphinx_rtd_theme          0.1.7                    py35_0    defaults

และสิ่งที่ติดตั้งผ่านpipมี<pip>เครื่องหมาย:

wxpython-common           3.0.0.0                   <pip>

8
มีผลเสียต่อการใช้ pip ในสภาพแวดล้อมของ Anaconda หรือไม่? เคยมีกรณีที่คุณต้องการใช้ pip แม้ว่าจะมีแพ็คเกจผ่าน Conda หรือไม่?
clifgray

ความแตกต่างคือขีดกลางและขีดล่าง? จะทำอย่างไรถ้าชื่อแพ็คเกจไม่มี วิธีการแยกความแตกต่างแล้ว?
Tom Hale

1
เครื่องหมายขีดล่างหรือเครื่องหมายขีดคั่นเป็นส่วนหนึ่งของชื่อแพ็กเกจ สิ่งนี้ไม่เกี่ยวข้องกับ pip หรือ conda <pip>แสดงให้เห็นว่ามันถูกติดตั้งด้วย pip มิฉะนั้นจะถูกติดตั้งกับ CONDA
Mike Müller

4
มีข้อแม้ขนาดใหญ่ที่มี "conda รู้เกี่ยวกับแพ็คเกจที่ติดตั้ง pip" จากความเข้าใจของฉันภายใน conda env, pip จะทำงานอย่างอิสระดังนั้น conda จึงไม่สามารถถอนการติดตั้งแพ็คเกจที่ติดตั้ง pip ได้
information_interchange

1
@clifgray - แพคเกจ pip และ conda ที่มีไลบรารี่ที่แชร์ในตัวเองอาจติดตั้งไบนารีที่เข้ากันไม่ได้ซึ่งจะเริ่มก่อให้เกิดความล้มเหลวของโลกดั้งเดิม (sigsegv-s เป็นต้น) ยากที่จะทำการดีบักสำหรับคนที่ไม่เร็วด้วย C debugger เช่นเดียวกับแพคเกจหลามเท่านั้นซึ่งเป็นเรื่องที่เข้าใจได้ง่าย
bobah

61

คำตอบสั้น ๆ คือคุณต้องการเพียงแค่ conda

  1. Conda ได้รวมการทำงานของ pip และ virtualenv ไว้ในแพ็คเกจเดียวได้อย่างมีประสิทธิภาพดังนั้นคุณไม่จำเป็นต้องใช้ virtualenv หากคุณกำลังใช้ conda

  2. คุณจะประหลาดใจที่มี Conda แพ็คเกจสนับสนุน หากไม่เพียงพอคุณสามารถใช้ pip ภายใต้ conda

นี่คือลิงค์ไปยังหน้า conda เปรียบเทียบ conda, pip และ virtualenv:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv- คำสั่ง


34

สภาพแวดล้อมเสมือนจริงและ pip

ฉันจะเพิ่มว่าการสร้างและลบสภาพแวดล้อม conda นั้นเรียบง่ายด้วย Anaconda

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

ในสภาพแวดล้อมที่เปิดใช้งานให้ติดตั้งแพ็คเกจผ่านcondaหรือpip:

(envname)> conda install <package>

(envname)> pip install <package>

สภาพแวดล้อมเหล่านี้เชื่อมโยงกับการจัดการแพคเกจเหมือน pip ของ condaอย่างมากดังนั้นจึงเป็นเรื่องง่ายในการสร้างสภาพแวดล้อมและติดตั้งแพ็คเกจ Python และ non-Python


Jupyter

นอกจากนี้การติดตั้งipykernelในสภาพแวดล้อมจะเพิ่มรายชื่อใหม่ลงในเมนูแบบเลื่อนลง Kernels ของโน้ตบุ๊ก Jupyter ซึ่งเป็นการขยายสภาพแวดล้อมที่สามารถจำลองได้ไปยังโน้ตบุ๊ก ตั้งแต่ Anaconda 4.1 มีการเพิ่ม nbextensionsเพิ่มส่วนขยายไปยังโน้ตบุ๊กได้ง่ายขึ้น

ความเชื่อถือได้

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


18

การติดตั้ง Conda จะช่วยให้คุณสามารถสร้างและลบสภาพแวดล้อมหลามตามที่คุณต้องการดังนั้นการให้คุณกับการทำงานเช่นเดียวกับvirtualenvจะ

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

แตกต่าง:

ข้อตกลงใบอนุญาต. ในขณะที่ virtualenv มาภายใต้แนวคิดเสรีนิยมมากที่สุดใบอนุญาต MIT , Condaใช้ใบอนุญาต BSD ข้อ 3

Conda มอบระบบควบคุมแพ็คเกจให้คุณ ระบบควบคุมแพ็กเกจนี้มักจะมีเวอร์ชั่นพรีคอมไพล์ (สำหรับระบบที่นิยมมากที่สุด) ของซอฟท์แวร์ non-python ซึ่งเป็นที่นิยม คือคุณไม่จำเป็นต้องคอมไพล์โค้ด C / C ++ ที่เหมาะสำหรับระบบของคุณ ในขณะที่มันเป็นความโล่งใจที่ดีสำหรับพวกเราส่วนใหญ่มันอาจส่งผลกระทบต่อประสิทธิภาพการทำงานของห้องสมุดดังกล่าว

ซึ่งแตกต่างจาก virtualenv, Conda ทำซ้ำบางไลบรารีระบบอย่างน้อยบนระบบ Linux ไลบรารีนี้อาจไม่ซิงค์ซึ่งนำไปสู่พฤติกรรมที่ไม่สอดคล้องกันของโปรแกรมของคุณ

คำตัดสิน:

Conda นั้นยอดเยี่ยมและควรเป็นตัวเลือกเริ่มต้นของคุณในขณะที่เริ่มต้นการเรียนรู้ด้วยเครื่อง มันจะช่วยคุณประหยัดเวลากับ gcc และแพ็คเกจจำนวนมาก กระนั้น Conda ไม่ได้แทนที่ virtualenv มันแนะนำความซับซ้อนเพิ่มเติมบางอย่างที่อาจไม่ต้องการ มันมาภายใต้ใบอนุญาตที่แตกต่างกัน คุณอาจต้องการหลีกเลี่ยงการใช้ conda ในสภาพแวดล้อมแบบกระจายหรือบนฮาร์ดแวร์ HPC


2
โปรดอธิบายเพิ่มเติมอีกเล็กน้อยว่าทำไม "คุณอาจต้องการหลีกเลี่ยงการใช้ conda ในสภาพแวดล้อมแบบกระจายหรือบนฮาร์ดแวร์ HPC" @ y.selivonchyk
โอลิเวอร์หู

1
ฉันไม่เห็นด้วยกับข้อสรุปเหล่านี้ "พฤติกรรมโปรแกรมที่ไม่สอดคล้องกัน" เป็นผลมาจากการกำหนดค่าโปรแกรมของคุณให้ใช้condaซอฟต์แวร์และไลบรารีที่ติดตั้งไม่ถูกต้อง และใน HPC นั้นcondaเป็นที่นิยมมากกว่าในหลายกรณีอันที่จริงมันถูกใช้โดย HPC Admins เพื่อแทนที่สิ่งต่าง ๆ เช่นmoduleระบบ อนุญาตให้ซอฟต์แวร์ที่ผู้ใช้ติดตั้งและการแยกซอฟต์แวร์ที่ใหญ่กว่าสองประเด็นใหญ่ใน HPC ข้อแม้เดียวที่ฉันพบคือระบบไฟล์ HPC จำนวนมากมีการ จำกัด จำนวนไฟล์ใน dir อย่างเข้มงวดและ conda จะสร้างไฟล์หลายพันไฟล์
user5359531

9

ฉันใช้ทั้งสองและ (ณ เดือนมกราคม 2020) พวกเขามีความแตกต่างผิวเผินบางอย่างที่ให้ยืมตัวเองเพื่อการใช้งานที่แตกต่างกันสำหรับฉัน โดยค่าเริ่มต้น Conda ต้องการจัดการรายการของสภาพแวดล้อมสำหรับคุณในตำแหน่งศูนย์กลางในขณะที่ virtualenv สร้างโฟลเดอร์ในไดเรกทอรีปัจจุบัน อดีต (รวมศูนย์) ทำให้รู้สึกว่าคุณเป็นเช่นทำการเรียนรู้ด้วยเครื่องและมีสภาพแวดล้อมกว้าง ๆ ที่คุณใช้ในหลายโครงการ หลัง (ต่อโฟลเดอร์โปรเจ็กต์) เหมาะสมถ้าคุณกำลังทำโปรเจ็กต์แบบครั้งเดียวเล็ก ๆ น้อย ๆ ที่มีชุดข้อกำหนด lib ที่แตกต่างกันโดยสิ้นเชิงซึ่งเป็นของโครงการมากขึ้น

สภาพแวดล้อมที่ว่างเปล่าที่ Conda สร้างขึ้นนั้นมีขนาดประมาณ 122MB ในขณะที่ virtualenv นั้นมีขนาดประมาณ 12MB ดังนั้นจึงเป็นอีกเหตุผลหนึ่งที่คุณไม่ต้องการกระจายสภาพแวดล้อมของ Conda ไปทุกที่

ในที่สุดข้อบ่งชี้ผิวเผินอื่นที่ Conda ชอบ envs แบบรวมศูนย์ก็คือ (อีกครั้งโดยค่าเริ่มต้น) หากคุณสร้าง Conda env ในโฟลเดอร์โครงการของคุณเองและเปิดใช้งานคำนำหน้าชื่อที่ปรากฏในเชลล์ของคุณคือ (ยาวเกินไป) เส้นทางไปยังโฟลเดอร์ คุณสามารถแก้ไขได้โดยให้ชื่อ แต่ virtualenv ทำสิ่งที่ถูกต้องตามค่าเริ่มต้น

ฉันคาดหวังว่าข้อมูลนี้จะค้างอย่างรวดเร็วเนื่องจากผู้จัดการแพคเกจทั้งสองแย่งชิงอำนาจ แต่สิ่งเหล่านี้เป็นการแลกเปลี่ยน ณ วันนี้ :)


คำอธิบายที่ดี! คุณมีปัญหาในการใช้ทั้งสองหรือไม่ คุณเคยใช้pipenvไหม
Mikhail_Sam

8

อีกตัวเลือกใหม่และวิธีการที่ฉันต้องการในปัจจุบันในการทำให้สภาพแวดล้อมและการใช้งานเป็นPipenv

ปัจจุบันเป็นเครื่องมือบรรจุภัณฑ์ Python ที่แนะนำอย่างเป็นทางการจาก Python.org


1
แจ้งเตือนเรื่องนี้ "ใช่มั้ย? สิ่งที่ pipenv?" ซึ่งทำให้ฉันreddit.com/r/Python/comments/8jd6aq/...และsedimental.org/the_packaging_gradient.html ฉันยังไม่รู้ว่าจะใช้อะไร แต่อย่างน้อยฉันก็ทราบดีกว่า ฉันคิด.
แมตต์วิลคี

หลังจากที่ดูบทนำอย่างรวดเร็วและการอ่านการแนะนำpipenvดูเหมือนจะไม่สามารถที่จะจัดการรุ่นหลาม ...
Carles Alcolea

@CarlesAlcolea pipenv สามารถระบุรุ่นต่าง ๆ ได้เช่น: pipenv --twoสำหรับ Python2 และ pipenv - สามสำหรับ python3
Kurian Benoy

3

ใช่condaติดตั้งง่ายกว่าvirtualenvเยอะมากและใช้แทนที่หลัง


6
ทำไมอนาคอนด้าให้คำแนะนำในการติดตั้งสภาพแวดล้อมเสมือนจริงหากมันมาแทนที่
jmh

1
@jmh งูไม่ได้แทนที่สภาพแวดล้อมเสมือนจะแทนที่เครื่องมือการจัดการสภาพแวดล้อมเสมือนงูหลามเฉพาะกับเครื่องมือการจัดการสภาพแวดล้อมทั่วไปมากขึ้นเสมือนvirtualenv condaนอกจากนี้ Anaconda ยังเป็นเพียงการแจกจ่าย Python + ที่มีเครื่องมือ Conda คำถาม (และคำตอบ) เป็นเพียงเกี่ยวกับ Conda
merv

3
คำตอบนี้ไม่ได้เพิ่มอะไรเลยนอกจากคำตอบที่มาหลายปีก่อน
merv

1

ฉันทำงานในองค์กรหลังไฟร์วอลล์หลายเครื่องที่ฉันไม่มีผู้ดูแลระบบ

จากประสบการณ์ที่ จำกัด ของฉันกับ python (2 ปี) ฉันเจอห้องสมุดน้อย (JayDeBeApi, sasl) ซึ่งเมื่อติดตั้งผ่าน pip threw ข้อผิดพลาดข้อผิดพลาดในการพึ่งพา C ++: Microsoft Visual C ++ 14.0 เป็นสิ่งจำเป็น รับด้วย "เครื่องมือสร้าง Microsoft Visual C ++": http://landinghub.visualstudio.com/visual-cpp-build-tools

สิ่งเหล่านี้ติดตั้งได้ดีกับ conda ดังนั้นตั้งแต่สมัยนั้นฉันเริ่มทำงานกับ conda env แต่มันไม่ง่ายที่จะหยุด conda จากการติดตั้งการพึ่งพาภายใน c.programfiles ที่ฉันไม่ได้มีการเข้าถึงการเขียน

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