Apakah Conda menggantikan kebutuhan akan virtualenv?

205

Saya baru-baru ini menemukan Conda setelah saya mengalami kesulitan menginstal SciPy, khususnya pada aplikasi Heroku yang saya kembangkan.

Dengan Conda Anda membuat lingkungan, sangat mirip dengan apa yang dilakukan virtualenv . Pertanyaan saya adalah:

  1. Jika saya menggunakan Conda, apakah akan menggantikan kebutuhan virtualenv? Jika tidak, bagaimana saya menggunakan keduanya bersama-sama? Apakah saya menginstal virtualenv di Conda, atau Conda di virtualenv?
  2. Apakah saya masih perlu menggunakan pip? Jika demikian, apakah saya masih dapat menginstal paket dengan pip di lingkungan yang terisolasi?
Kritz
sumber
Jika Anda tertarik menggunakan conda dan pip di Heroku, lihat misalnya github.com/faph/conda-pip-buildpack
faph
Terima kasih. Saya perhatikan ada cukup banyak paket konda untuk Heroku di github. Faktor apa yang harus saya perhitungkan ketika memutuskan buildpack mana yang akan digunakan?
Kritz
Perhatikan bahwa Anda masih perlu menggunakan pip jika Anda ingin menginstal paket yang tidak tersedia langsung dari server Continuum.
ali_m
Ya, saya melihat bahwa mereka masih menggunakan Django 1.8 (bukan 1.9). Saat ini saya akan menggunakan conda di mana diperlukan (cerdik dan numpy) dan pip untuk yang lainnya - tetapi masih dalam conda.
Kritz
Kebanyakan condpack builder Heroku berasal dari yang dibuat oleh Kenneth Reitz. Dengan orang-orang mengutak-atik mereka agar sesuai preferensi mereka. Periksa apakah mereka menyertakan dukungan conda dan pip jika itu yang Anda butuhkan. Dan jika mereka mendukung file environment.yml. Anda selalu dapat dengan cepat melihat melalui kode buildpack untuk melihat apakah Anda menyukai skrip build, misalnya untuk melihat bagaimana sebenarnya lingkungan dibuat.
mulai

Jawaban:

157
  1. Conda menggantikan virtualenv. Menurut saya itu lebih baik. Ini tidak terbatas pada Python tetapi dapat digunakan untuk bahasa lain juga. Dalam pengalaman saya, ini memberikan pengalaman yang jauh lebih lancar, terutama untuk paket ilmiah. Pertama kali saya menginstal MayaVi dengan benar di Mac adalah dengan conda.

  2. Anda masih bisa menggunakan pip. Bahkan, condainstal pipdi setiap lingkungan baru. Ia tahu tentang paket pip-instal.

Sebagai contoh:

conda list

daftar semua paket yang diinstal di lingkungan Anda saat ini. Paket-paket yang diinstal-konda muncul seperti ini:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

dan yang diinstal melalui pipmemiliki <pip>penanda:

wxpython-common           3.0.0.0                   <pip>
Mike Müller
sumber
8
Apakah ada negatif menggunakan pip di lingkungan Anaconda? Apakah ada kasus di mana Anda ingin menggunakan pip meskipun paket tersedia melalui Conda?
clifgray
Perbedaannya adalah tanda hubung vs garis bawah? Bagaimana jika nama paket tidak memiliki keduanya? Bagaimana cara membedakannya?
Tom Hale
1
Garis bawah atau tanda hubung adalah bagian dari nama paket. Ini tidak ada hubungannya dengan pip atau conda. The <pip>menunjukkan bahwa itu dipasang dengan pip jika tidak diinstal dengan conda.
Mike Müller
4
Ada peringatan besar dengan "conda tahu tentang paket pip-instal". Dari pemahaman saya, di dalam conda env, pip bertindak secara independen, jadi conda tidak dapat menghapus paket yang diinstal pip misalnya
information_interchange
1
@clifgray - paket pip dan konda yang memiliki pustaka bersama asli dapat menginstal versi biner yang tidak kompatibel yang akan mulai menyebabkan semua jenis kegagalan dunia asli (sigsegv-s, dll.) sulit untuk di-debug untuk seseorang yang tidak mempercepat dengan debugger C. Sama untuk paket python saja, hanya saja itu mudah dimengerti.
bobah
61

Jawaban singkatnya adalah, Anda hanya perlu konda.

  1. Conda secara efektif menggabungkan fungsi pip dan virtualenv dalam satu paket, sehingga Anda tidak perlu virtualenv jika Anda menggunakan conda.

  2. Anda akan terkejut betapa banyak paket yang mendukung conda. Jika tidak cukup, Anda dapat menggunakan pip di bawah conda.

Berikut ini tautan ke halaman conda yang membandingkan conda, pip, dan virtualenv:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands .

Fisikawan Gila
sumber
34

Lingkungan Virtual dan pip

Saya akan menambahkan bahwa membuat dan menghapus lingkungan conda sederhana dengan Anaconda.

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

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

Dalam lingkungan yang diaktifkan , instal paket melalui condaatau pip:

(envname)> conda install <package>

(envname)> pip install <package>

Lingkungan ini sangat terkait dengan manajemen paket pip seperti conda , sehingga mudah untuk membuat lingkungan dan menginstal paket Python dan non-Python.


Jupyter

Selain itu, menginstalipykernel di lingkungan menambahkan daftar baru di menu dropdown kernel dari notebook Jupyter, memperluas lingkungan yang dapat direproduksi ke notebook. Pada Anaconda 4.1, nbextensions telah ditambahkan , menambahkan ekstensi ke notebook lebih mudah.

Keandalan

Dalam pengalaman saya, conda lebih cepat dan lebih dapat diandalkan dalam menginstal perpustakaan besar seperti numpydan pandas. Selain itu, jika Anda ingin mentransfer keadaan lingkungan Anda yang dilestarikan, Anda dapat melakukannya dengan berbagi atau mengkloning env.

pylang
sumber
18

Menginstal Conda akan memungkinkan Anda untuk membuat dan menghapus lingkungan python seperti yang Anda inginkan, karena itu memberi Anda fungsionalitas yang sama dengan virtualenv .

Dalam kasus kedua distribusi, Anda dapat membuat pohon sistem file yang terisolasi, tempat Anda dapat menginstal dan menghapus paket python (mungkin, dengan pip) seperti yang Anda inginkan. Yang mungkin berguna jika Anda ingin memiliki versi berbeda dari pustaka yang sama untuk kasus penggunaan yang berbeda atau Anda hanya ingin mencoba beberapa distribusi dan menghapusnya setelah itu menghemat ruang disk Anda.

Perbedaan:

Perjanjian lisensi. Sementara virtualenv berada di bawah lisensi MIT paling liberal , Conda menggunakan lisensi 3 klausa BSD.

Conda menyediakan Anda dengan sistem kontrol paket mereka sendiri. Sistem kontrol paket ini sering menyediakan versi yang telah dikompilasi (untuk sistem paling populer) dari perangkat lunak non-python populer, yang dapat dengan mudah membuat beberapa paket pembelajaran mesin bekerja. Yaitu Anda tidak perlu mengkompilasi kode C / C ++ yang dioptimalkan untuk sistem Anda. Meskipun itu sangat melegakan bagi sebagian besar dari kita, itu mungkin mempengaruhi kinerja perpustakaan seperti itu.

Tidak seperti virtualenv, Conda menduplikasi beberapa pustaka sistem setidaknya pada sistem Linux. Perpustakaan ini dapat keluar dari sinkronisasi yang mengarah ke perilaku program Anda yang tidak konsisten.

Putusan:

Conda sangat bagus dan harus menjadi pilihan default Anda saat memulai dengan pembelajaran mesin. Ini akan menghemat waktu Anda bermain-main dengan gcc dan banyak paket. Namun, Conda tidak menggantikan virtualenv. Ini memperkenalkan beberapa kompleksitas tambahan yang mungkin tidak selalu diinginkan. Itu datang di bawah lisensi yang berbeda. Anda mungkin ingin menghindari penggunaan kondominium pada lingkungan terdistribusi atau perangkat keras HPC.

y.selivonchyk
sumber
2
keberatan menguraikan lebih banyak mengapa "Anda mungkin ingin menghindari menggunakan konda pada lingkungan terdistribusi atau pada perangkat keras HPC"? @ y.selivonchyk
Oliver Hu
1
Saya tidak setuju dengan beberapa kesimpulan ini. "Perilaku program yang tidak konsisten" adalah hasil dari tidak mengkonfigurasi program Anda dengan benar untuk menggunakan condaperangkat lunak dan perpustakaan yang diinstal. Dan dalam HPC, condalebih disukai dalam banyak kasus, sebenarnya itu digunakan oleh Admin HPC untuk menggantikan hal-hal seperti modulesistem. Ini memungkinkan perangkat lunak yang diinstal pengguna dan isolasi perangkat lunak yang lebih besar, dua masalah besar pada HPC. Satu-satunya peringatan yang saya alami adalah bahwa banyak sistem file HPC memiliki batasan keras pada jumlah file dalam suatu dir, dan konda menciptakan banyak 1.000 file.
user5359531
9

Saya menggunakan keduanya dan (pada Jan, 2020) mereka memiliki beberapa perbedaan dangkal yang memungkinkan mereka untuk penggunaan yang berbeda untuk saya. Secara default Conda lebih suka mengelola daftar lingkungan untuk Anda di lokasi pusat, sedangkan virtualenv membuat folder di direktori saat ini. Yang pertama (terpusat) masuk akal jika Anda misalnya melakukan pembelajaran mesin dan hanya memiliki beberapa lingkungan luas yang Anda gunakan di banyak proyek dan ingin melompat ke dalamnya dari mana saja. Yang terakhir (per folder proyek) masuk akal jika Anda melakukan sedikit proyek satu kali yang memiliki set persyaratan lib yang sangat berbeda yang benar-benar milik lebih dari proyek itu sendiri.

Lingkungan kosong yang dibuat Conda adalah sekitar 122MB sedangkan virtualenv adalah sekitar 12MB, jadi itu alasan lain Anda mungkin memilih untuk tidak menyebarkan lingkungan Conda di mana-mana.

Akhirnya, indikasi dangkal lain bahwa Conda lebih suka envs terpusat adalah bahwa (sekali lagi, secara default) jika Anda memang membuat Conda env di folder proyek Anda sendiri dan mengaktifkannya awalan nama yang muncul di shell Anda adalah absolut (terlalu lama) mutlak path ke folder. Anda dapat memperbaikinya dengan memberinya nama, tetapi virtualenv melakukan hal yang benar secara default.

Saya berharap info ini menjadi basi dengan cepat ketika dua manajer paket bersaing untuk mendapatkan dominasi, tetapi ini adalah kompromi dari hari ini :)

Pat Niemeyer
sumber
Penjelasan yang bagus! Apakah Anda mengalami kesulitan menggunakan keduanya? Apakah kamu pernah menggunakan pipenv?
Mikhail_Sam
8

Opsi baru lain dan metode pilihan saya saat ini untuk mendapatkan lingkungan dan berjalan adalah Pipenv

Saat ini alat pengemasan Python yang direkomendasikan secara resmi dari Python.org

Kritz
sumber
1
Ini mendorong "eh? Apa itu pipenv?", Yang mengarahkan saya ke reddit.com/r/Python/comments/8jd6aq/… dan sedimental.org/the_packaging_gradient.html . Saya masih tidak tahu apa yang harus digunakan tetapi setidaknya saya mendapat informasi lebih baik. Kupikir.
matt wilkie
Setelah menonton intro dan dengan cepat membaca pengantar, pipenv tampaknya tidak dapat mengelola versi Python ...
Carles Alcolea
@CarlesAlcolea pipenv dapat menentukan berbagai versi juga oleh: pipenv --twountuk Python2 dan pipenv --tiga untuk python3
Kurian Benoy
3

Ya, condajauh lebih mudah untuk menginstal daripada virtualenv, dan cukup banyak menggantikan yang terakhir.

Liang Huang
sumber
6
Mengapa Anaconda memberikan instruksi untuk menginstal lingkungan virtual jika itu menggantikan mereka?
jmh
1
@jmh Anaconda tidak menggantikan lingkungan virtual, ia menggantikan alat manajemen lingkungan virtual khusus-Python virtualenvdengan alat manajemen lingkungan virtual yang lebih umum conda. Juga, Anaconda hanyalah distribusi Python + yang mencakup alat Conda; pertanyaan (dan jawaban) hanya tentang Conda.
merv
3
Jawaban ini tidak menambahkan apa pun di luar jawaban yang datang bertahun-tahun sebelumnya.
merv
1

Saya bekerja di perusahaan, di belakang beberapa firewall dengan mesin yang saya tidak punya akses admin

Dalam pengalaman saya yang terbatas dengan python (2 tahun) saya telah menemukan beberapa perpustakaan (JayDeBeApi, sasl) yang ketika menginstal melalui pip melemparkan kesalahan kesalahan ketergantungan C ++: diperlukan Microsoft Visual C ++ 14.0. Dapatkan dengan "Microsoft Visual C ++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

ini dipasang dengan conda, maka sejak saat itu saya mulai bekerja dengan conda env. Namun itu tidak mudah untuk menghentikan conda dari menginstal dependensi di dalam c.programfiles di mana saya tidak memiliki akses tulis.

rohit arora
sumber