Apa hubungan antara virtualenv dan pyenv?

175

Saya baru-baru ini belajar bagaimana menggunakan virtualenv dan virtualenvwrapper dalam alur kerja saya, tetapi saya telah melihat pyenv yang disebutkan dalam beberapa panduan tetapi saya tidak bisa mendapatkan pemahaman tentang apa itu pyenv dan bagaimana perbedaannya / mirip dengan virtualenv. Apakah pyenv pengganti yang lebih baik / lebih baru untuk virtualenv atau alat gratis? Jika yang terakhir apa fungsinya secara berbeda dan bagaimana keduanya (dan virtualenvwrapper jika berlaku) bekerja bersama?

kebenaran1
sumber
3
fgimian.github.io/blog/2014/04/20/… : Namun, ada alternatif lain yang disebut pyenv yang memiliki beberapa keunggulan signifikan .
Martijn Pieters
11
Jangan seperti saya dan pyenvbingung denganpyvenv
Pengguna

Jawaban:

162

Pyenv dan virtualenv adalah alat yang sangat berbeda yang bekerja dengan cara berbeda untuk melakukan hal yang berbeda:

  • Pyenv adalah ekstensi bash - tidak akan berfungsi di Windows - yang memotong panggilan Anda ke python, pip, dll., Untuk mengarahkan mereka ke salah satu dari beberapa rantai alat sistem python. Jadi Anda selalu memiliki semua pustaka yang telah Anda instal dalam versi python yang dipilih tersedia - karena itu baik untuk pengguna yang harus beralih di antara versi python yang berbeda.

  • VirtualEnv , adalah python murni sehingga bekerja di mana-mana, itu membuat salinan, opsional versi tertentu, python dan pip lokal ke lingkungan aktif yang mungkin atau mungkin tidak termasuk tautan ke rantai-alat sistem saat ini, jika tidak Anda bisa instal subset perpustakaan yang diketahui ke dalam lingkungan itu. Karena itu hampir pasti jauh lebih baik untuk pengujian dan penyebaran karena Anda tahu persis perpustakaan mana, di mana versi, digunakan dan perubahan global tidak akan berdampak pada modul Anda.

venv python> 3.3

Perhatikan bahwa dari Python 3.3 dan seterusnya ada implementasi built-in dari VirtualEnv yang disebut venv (dengan, pada beberapa instalasi, pembungkus yang disebut pyvenv - pembungkus ini sudah tidak digunakan lagi dalam Python 3.6 ), yang mungkin harus digunakan sebagai preferensi. Untuk menghindari kemungkinan masalah dengan pembungkus, sering kali merupakan ide yang baik untuk menggunakannya secara langsung dengan menggunakan /path/to/python3 -m venv desired/env/pathatau Anda dapat menggunakan pypemilih python yang luar biasa pada Windows py -3 -m venv desired/env/path. Itu akan membuat direktori yang ditentukan dengan desired/env/pathconfigure dan mengisi itu dengan tepat. Secara umum sangat mirip dengan menggunakan VirtualEnv.

Alat tambahan

Ada sejumlah alat yang perlu disebutkan, dan dipertimbangkan, karena mereka dapat membantu dengan penggunaan satu atau lebih hal di atas:

  • VirtualEnvWrapper Mengelola dan menyederhanakan penggunaan dan pengelolaan VirtualEnv - Cross Platform .
  • pyenv-virtualenv , diinstal oleh pyenv-installer , yang memberikan alat PyEnv untuk mengelola dan berinteraksi dengan VirtualEnv - dengan ini Anda dapat memiliki instalasi dasar yang mencakup lebih dari satu versi python dan menciptakan lingkungan terisolasi di dalamnya - Linux / OS- X . Disarankan oleh Johann Visagie
  • PyInstaller dapat mengambil kode python Anda, mungkin dikembangkan & diuji di bawah VirtualEnv, dan bundel sehingga dapat menjalankan satu platform yang tidak memiliki versi python yang diinstal - Perhatikan bahwa ini bukan kompiler silang, Anda akan memerlukan Windows (virtual) -) mesin untuk membangun instalasi Windows, dll., tetapi dapat berguna bahkan di mana Anda dapat memastikan bahwa python akan diinstal tetapi tidak dapat memastikan bahwa versi python dan semua pustaka akan kompatibel dengan kode Anda.
Steve Barnes
sumber
3
Mungkin layak menyebutkan pyenv-virtualenv, sebuah plugin pyenv yang memungkinkan pyenv dan virtualenv bekerja dengan mulus secara bersamaan. Jika Anda menginstal pyenv menggunakan installer-pyenv, pyenv-virtualenv sudah akan ada. * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv
1
Bagaimana venv, sekarang di perpustakaan standar?
Flimm
@Flimm: Dari python 3.3 dan seterusnya venv adalah bagian dari perpustakaan standar dan harus digunakan sebagai pengganti virtualenv karena sering digambarkan sebagai "virtualenv dilakukan dengan benar" - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Steve Barnes
2
pyenv-virtualenv bukan (atau setidaknya tidak lagi) hanya linux. Ada paket homebrew untuk menginstalnya dengan mudah di MacOS.
Belok
Terima kasih telah menyoroti interoperabilitas!
HashRocketSyntax
16

virtualenvmemungkinkan Anda untuk membuat instalasi Python khusus misalnya dalam subdirektori proyek Anda. Setiap proyek Anda dengan demikian dapat memiliki sendiri python(atau bahkan beberapa) di bawah virtualenv masing-masing. Tidak masalah bagi beberapa / semua virtualenvs untuk bahkan memiliki versi yang sama python(misalnya 2.7.16) tanpa konflik - mereka hidup secara terpisah dan tidak saling mengenal. Jika Anda ingin menggunakan salah satu dari pythonitu, Anda harus melakukannya activate(dengan menjalankan skrip yang akan sementara memodifikasi Anda PATHuntuk memastikan bahwa bin/direktori virtualenv yang lebih dulu). Dari titik itu, panggilan python(atau pipdll.) Akan memanggil versi virtualenv sampai Anda deactivate(yang mengembalikan PATH).

pyenvberoperasi pada skala yang lebih luas daripada virtualenv- ia menyimpan daftar instalasi Python (dan dapat digunakan untuk menginstal yang baru) dan memungkinkan Anda untuk mengonfigurasi versi Python mana yang akan dijalankan ketika Anda menggunakan pythonperintah. Kedengarannya mirip tetapi penggunaan praktis agak berbeda. Ia bekerja dengan menambahkan pythonskrip shim ke Anda PATH(secara permanen) dan kemudian memutuskan mana yang "nyata" pythonuntuk dipanggil. Anda bahkan dapat mengkonfigurasi pyenv untuk memanggil salah satu python virtualenv Anda (dengan menggunakan pyenv-virtualenvplugin). Versi Python yang Anda instal menggunakan pyenvgo ke $(pyenv root)/versions/direktori (secara default, root pyenv adalah ~ / .pyenv) jadi lebih 'global' daripada virtualenv. Biasanya, Anda tidak dapat menduplikasi versi Python yang diinstal melalui pyenv, setidaknya melakukannya bukan ide utama.

Untuk membuat virtualenv dengan versi Python tertentu, Anda perlu memiliki versi itu di suatu tempat di sistem Anda (apakah itu pada PATHatau tidak) dan pada dasarnya mengkloningnya ke dalam virtualenv yang baru dibuat. Tentu saja, salah satu cara untuk mendapatkan versi tertentu adalah menginstalnya melalui pyenv. Setelah selesai, masing-masing virtualvv bebas untuk menyimpang dengan memasang modul (atau versi) yang berbeda ke dalamnya.

Pendeknya:

  • virtualenv memungkinkan Anda untuk membuat instalasi python lokal dan independen dengan mengkloning dari yang sudah ada
  • pyenv memungkinkan Anda untuk menginstal berbagai versi python secara bersamaan (baik di seluruh sistem atau hanya untuk pengguna lokal) dan kemudian memilih yang mana dari banyak ular sanca untuk dijalankan pada waktu tertentu (termasuk yang dibuat oleh virtualenv atau Anaconda)
Błażej Czapp
sumber