Venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, vb. Arasındaki fark nedir?


1022

Python 3.3 standart kütüphanesinde yeni paketi içerir venv. Ne yapar ve normal ifadeyle eşleşmiş gibi görünen diğer tüm paketlerden farkı (py)?(v|virtual|pip)?envnedir?


20
Ve yakın oyları önlemek için, bunun stackoverflow.com/questions/29950300/… ' dan daha genel bir soru olduğunu hissettim ve bu yüzden bu soruyu düzenlemek veya o yazıya aşırı genel bir cevap göndermek için rahat hissetmedim.
17'de Flimm

12
Bu kılavuz, şeyler yapmak için daha fazla ve daha fazla "bir ve sadece tek bir yol" eklemeye devam ettikçe hem yararlı hem de sürekli olarak güncellenmektedir: docs.python-guide.org/en/latest/dev/virtualenvs
michael

2
3.6 itibariyle macOS (ben bir pyNoob) pyenv ile karşılaştırıldığında virtualenv çalışma daha kolay buldum
HashRocketSyntax 29:18

@HashRocketSyntax virtualenvve pyenvaynı işlevi gerçekleştirmezler ve birbirlerine alternatif değildirler. Cevabımı gör.
Flimm

6
Pipenv ile bütün gün boşa zaman harcadım. Alt satırda, aşırı pazarlanmış. Venv ve virtualenv py2'ye ihtiyacınız varsa uygun araçlardır. Conda (tam yığın ihtiyacınız yoksa miniconda) da çok iyi. Çok iyi bir yazı: chriswarrick.com/blog/2018/07/17/…
SwimBikeRun

Yanıtlar:


1382

Standart kütüphanede olmayan PyPI paketleri:

  • virtualenvPython kütüphaneleri için yalıtılmış Python ortamları oluşturan çok popüler bir araçtır. Bu araca aşina değilseniz, çok yararlı bir araç olduğu için öğrenmenizi şiddetle tavsiye ederim ve bu cevabın geri kalanı için onunla karşılaştırmalar yapacağım.

    Bir dizine bir grup dosya yükleyerek (örn. env/:) Ve ardından PATHortam değişkenini özel bir bindizine önek olarak değiştirerek çalışır (örneğin:) env/bin/. pythonVeya python3dizininin tam bir kopyası bu dizine yerleştirilir, ancak Python önce ortam dizininde yoluna göre kütüphaneleri arayacak şekilde programlanır. Python'un standart kütüphanesinin bir parçası değildir, ancak resmi olarak PyPA (Python Ambalaj Kurumu) tarafından kutsanmıştır. Etkinleştirildiğinde, paketlerini kullanarak sanal ortama yükleyebilirsiniz pip.

  • pyenvPython sürümlerini izole etmek için kullanılır. Örneğin, kodunuzu Python 2.7, 3.6, 3.7 ve 3.8'e göre test etmek isteyebilirsiniz, böylece kodlar arasında geçiş yapmak için bir yol gerekir. Etkinleştirildikten sonra , Python komutlarıyla ( , ) eşleşen özel dosyaların bulunduğu PATHortam değişkeninin ~/.pyenv/shimsönüne eklenir . Bunlar Python tarafından gönderilen komutların kopyaları değildir; ortam değişkenine, dosyaya veya dosyaya göre Python'un hangi sürümünün çalıştırılacağına karar veren özel komut dosyalarıdır. ayrıca komutu kullanarak birden fazla Python sürümünü indirme ve yükleme işlemini kolaylaştırır .pythonpipPYENV_VERSION.python-version~/.pyenv/versionpyenvpyenv install

  • pyenv-virtualenviçin bir eklenti pyenvile aynı yazar tarafından pyenv, kullanmak için izin pyenvve virtualenvelverişli aynı zamanda. Ancak, Python 3.3 veya üstünü kullanıyorsanız , yerine kullanılabilirse pyenv-virtualenvçalıştırmayı dener . Kolaylık özelliklerini istemiyorsanız, birlikte ve birlikte kullanabilirsiniz .python -m venvvirtualenvvirtualenvpyenvpyenv-virtualenv

  • virtualenvwrapper, bir uzantılar kümesidir virtualenv( dokümanlara bakın ). Bu gibi komutları verir mkvirtualenv, lssitepackagesve özellikle workonfarklı arasında geçiş yapmak için virtualenvdizinleri. Bu araç, özellikle birden çok virtualenvdizin istiyorsanız faydalıdır .

  • pyenv-virtualenvwrapperiçin bir eklenti pyenvile aynı yazar tarafından pyenvrahatlıkla entegre etmek, virtualenvwrapperiçine pyenv.

  • pipenvamaçları birleştirmek Pipfile, pipve virtualenvkomut satırında tek bir komut haline. virtualenvDizin tipik yerleştirilen alır ~/.local/share/virtualenvs/XXXile, XXXproje dizininin yolunu karma olmak. Bu, virtualenvdizinin genellikle geçerli çalışma dizininde olduğu yerden farklıdır . pipenvPython uygulamaları geliştirilirken kullanılmalıdır (kütüphanelerin aksine). Bu soru sadece benzer şekilde adlandırılan paketlerle ilgili olduğu için burada listelemeyeceğim pipenvgibi alternatifler var poetry.

Standart kütüphane:

  • pyvenvPython 3 ile birlikte gelen, ancak sorunları olduğu için Python 3.6'da kullanımdan kaldırılan bir komut dosyasıdır (kafa karıştırıcı addan bahsetmemek gerekirse). Python 3.6+ sürümünde tam eşdeğerdir python3 -m venv.

  • venvkullanarak çalıştırabileceğiniz Python 3 ile birlikte gelen bir pakettir python3 -m venv(bazı nedenlerden dolayı bazı dağıtımlar python3-venvUbuntu / Debian gibi ayrı bir dağıtım paketine ayırır ). Aynı amaca hizmet eder virtualenv, ancak özelliklerinin yalnızca bir alt kümesine sahiptir ( burada bir karşılaştırmaya bakın ). özellikle Python 2 ve 3'ü desteklediğinden virtualenvdaha popüler olmaya devam ediyor venv.

Yeni başlayanlar için öneriler:

Bu yeni başlayanlar için benim kişisel öneri: öğrenme başlayacak virtualenvve piphangi çalışma Python 2 ve 3 her ikisi ile ve durumlarda çeşitli, araçlar ve bunları gerek başladığınızda diğer araçları pick up.


115
Bu çok yardımcı! Öyleyse neden 1 yerine 8 karışık şey var? (“Bunu yapmanın bir - ve tercihen tek - açık bir yolu olmalı.” - Python'un
Zen'i

59
@ Jerry101, venv'in tanıtımı kısmen bu karışıklığa bir cevaptır. Durumu iyileştirmeye yardımcı olmak istiyorsanız, venv kullanmanızı ve başkalarını da aynı şeyi yapmaya teşvik etmenizi öneririm.
Magnus Lind Oxlund

31
"venv'in tanıtımı kısmen bu karmaşaya bir cevaptır" X gibi bir şey yapan çok fazla şey olduğunda, insanlar her zaman "X gibi bir şey" yapan başka bir şey yaparak bu karmaşayı geliştirebileceklerini düşünürler . Aslında biraz komik. Şimdi 4 yıl sonrayız ... sormak uygun olabilir, venvbu sorunu gerçekten çözdü mü?
Kris

34
Listedeki tartışmasız olarak aynı bölgeyi gerçekten kapsayan iki araç sanalenv ve venv'dir, bu nedenle birkaç rakip aracın neden olduğu bir karmaşa ile uğraştığımız karakterizasyon çok kesin değildir. Bununla birlikte, liste, benzer isimleri olan sanal ortamla ilgili birkaç araçtan oluşur. Bu, özellikle sadece onları öğrenen kullanıcılar için kafa karıştırıcı olabilir. Venv durumu iyileştirdi mi? Yerel değişikliklerden ve standart kütüphanede bir noktadan yararlanarak diğer sanal ortam araçlarına daha hafif bir alternatif sunmuştur. …
Magnus Lind Oxlund

11
@cowbert Python 3.5'ten Python 3.6'ya yükseltme yaptıktan ve tüm sanal verilerimin kırılmasından sonra, venvyeni bir Python sürümüne daha kolay bir şekilde yükseltmenize izin veriyor gibi görünüyor .
Daniel H

276

Sadece virtualenvPython3.3 + ' dan sonra kullanmaktan kaçınır ve bunun yerine standart sevk edilen kütüphaneyi kullanırdım venv. Yeni bir sanal ortam oluşturmak için şunu yazarsınız:

$ python3 -m venv <MYVENV>  

virtualenvPython ikilisini sanal ortamın bin dizinine kopyalamaya çalışır. Ancak bu ikili dosyaya katıştırılmış kitaplık dosya bağlantılarını güncelleştirmez, bu nedenle Python'u kaynaktan göreli yol adlarına sahip sistem dışı bir dizine oluşturursanız, Python ikili kesilir. Kopyalanabilir Python kopyasını bu şekilde yaptığınız için büyük bir kusur. BTW OS X üzerindeki gömülü kütüphane dosya bağlantılarını incelemek için kullanın otool. Örneğin, sanal ortamınızın içinden şunu yazın:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Sonuç olarak kaçınır virtualenvwrapperve pipenv. pyvenvkullanımdan kaldırıldı. pyenvsık kullanılan yerde sık kullanılan gibi görünüyor virtualenvama ben venvde ne pyenviçin inşa düşünüyorum da ondan uzak kalmak istiyorum .

venvHangi kabukta sanal ortamlar oluşturur taze ve kum havuzu ile, kullanıcı tarafından takılabilir kütüphaneler ve bu kadar çok piton kasa . Taze sanal ortamlar sadece python ile gemi, sizinle baştan başka kütüphaneleri yüklemek zorunda olduğu standart kütüphaneler ile başlar, çünkü pip installsanal ortam aktifken. Bu yeni kitaplık yüklemelerinin hiçbiri sanal ortamın dışında görünmediği için korumalı alan olduğundan, temel python yüklemenizi etkilemeden endişelenmeden tüm ortamı silebilir ve yeniden başlayabilirsiniz. Sanal ortamın hedef klasörü olmadan oluşturulduğu için kullanıcı tarafından yüklenebilen kütüphanelersudozaten sahip olduğunuz bazı dizinlerde sudokitaplık yüklemek için izniniz gerekmez . Son olarak çoklu-python güvenlidir , çünkü sanal ortamlar etkinleştirildiğinde, kabuk yalnızca o sanal ortamı oluşturmak için kullanılan python sürümünü (3.4, 3.5 vb.) Görür.

pyenv, venvbirden çok python ortamını yönetmenize izin verdiği için benzerdir . Bununla birlikte pyenv, kütüphane kurulumlarını bir başlangıç ​​durumuna kolayca geri alamazsınız ve muhtemelen adminbir noktada kütüphaneleri güncellemek için ayrıcalıklara ihtiyacınız olacaktır . Bu yüzden kullanmak da en iyisi venv.

Son birkaç yıl içinde derleme sistemlerinde (emacs paketleri, python bağımsız uygulama geliştiricileri, yükleyiciler ...) nihayetinde sorunlara yol açan birçok sorun buldum virtualenv. Bu ek seçeneği ortadan kaldırdığımızda ve yalnızca kullandığımızda python'un daha iyi bir platform olacağını düşünüyorum venv.


3
add2virtualenvaltında PYTHONPATHözel bir _virtualenv_path_extensions.pthdosya ekleyerek ince ayar yapabilirsiniz site-packages. Alternatif olarak , sanal ortamı her etkinleştirdiğinizde aradığınız dosyadaki PYTHONPATHortam değişkenini güncelleyebilirsiniz bin/activate. Ya site-packagesda ekstra dizinlere işaret etmek için altında semboller ekleyebilirsiniz . Bu alternatiflerin her ikisi de, geliştiricilerin sorun gidermek için yaygın olarak kullandıkları geleneksel komut satırı araçları için daha şeffaftır. .pthBelgelenmemiş bir isme sahip bir gelenek kullanımı, onu daha büyülü bir IMO gibi gösterir.
Riaz Rizvi

15
Tamam, stackoverflow.com/questions/48130371/… 'PYTHONPATH de ihtiyacı gidermek için doğru bir güncelleme olduğunu doğruladım add2virtualenv. İlk yorumunuzdan SO'da yardım eksikliği ile ilgili olarak, tek önerim sorununuzu çözdüklerinde cevapları yanıtlamaktır, insanları yayınladığınızda sizin için sorun gidermeye motive etmek için? Yarım saatlik bir araştırma + fare tıklaması karşılığında yazma? İyi bir ticaret gibi geliyor ...
Riaz Rizvi

7
Hayır, haklısın - Ben oylama konusunda iyi olmaya çalışıyorum. Heck, eğer bölgemde olsaydın sana bira satın alırdım. Sözümü iyi tutacağım ve python doc milletinin / bin / / / / / resmi belgelere açıklık getirmek için değişikliği eklememe izin verip vermeyeceğini göreceğim. Harika olmasam da, python'da korkunç değilim. Benim için zor olsaydı ... Her neyse, zaman ayırdığınız için teşekkür ederim - size en iyisini diliyorum.
SteveJ

9
@ MalikA.Rumi nimet biraz "bize ve diğerlerine özenle pazarlanan Pipenv yaratıcısı, bu yüzden Pipenv bahsediyoruz" azaltılmıştır.
Rob Grant

6
@AndreaMoro Bu pyvenvreddedildi, değil pyenv. Bu araçların isimleriyle karıştırmak çok kolay.
Daniel Holmes

24

pipenvTavşan deliğine indim ( gerçekten derin ve karanlık bir delik ... ) ve son cevap 2 yıldan fazla olduğu için, tartışmayı Python sanal zarflar konusundaki en son gelişmelerle güncellemenin yararlı olduğunu düşündüm buldum.

YASAL UYARI:

Bu cevap, zarf çözümleri olarak pipenv ve venv'in esası hakkındaki tartışmalara devam etmekle ilgili DEĞİLDİR - Ben de hiçbirini onaylamıyorum . Yaklaşık var PyPA gelecekteki gelişimi çelişkili standartlarını onaylayan ve nasıl Virtualenv bir yapım olumsuzladığı için vaat ya / ya hiç aralarındaki seçim. Bu iki araca tam olarak odaklandım, çünkü bunlar PyPA tarafından görevlendirilmiş olanlar .

venv

OP'nin belirttiği gibi, venv ortamları sanallaştırmak için bir araçtır. DEĞİL üçüncü şahıs çözüm, ancak yerli bir araç. PyPA Onayladı venv oluşturmak için SANAL ENVELOPES : " sürüm 3.5 Değişen: venv kullanımı artık sanal ortamlar oluşturmak için tavsiye edilir ".

pipenv

pipenv - gibi venv - ayrıca sanal zarfları ama rulolar-paket yönetimi ve oluşturmak için kullanılabilecek açığı denetimi işlevselliği. Bunun yerine kullanmanınrequirements.txt,pipenvaracılığıyla paket yönetimi sunar Pipfile . As PyPA için Onayladı pipenv PAKETİ YÖNETİMİ , ima etmek gibi görünüyorpipfileyerini etmektirrequirements.txt.

ANCAK : pipenv kullandığı VIRTUALENV , sanal zarf oluşturmak için kendi araç olarak değil venv tarafından kabul edildiği PyPA sanal zarf oluşturmak yöneldiği bir araç olarak.

Çelişen Standartlar:

Dolayısıyla, sanal bir zarf çözümüne yerleşmek yeterince zor değilse, şimdi farklı sanal zarf çözümleri kullanan iki farklı aracı destekleyen PyPA'mız var . Bu çatışmayı vurgulayan venv vs virtualenv hakkındaki azgın Github tartışmasını burada bulabilirsiniz .

Çatışma çözümü:

Yukarıdaki bağlantıyı başvurulan Github tartışma yönlendirilmiş sahiptir Virtualenv kapasiteli yönünde gelişmesini venv içinde gelecek sürümleri :

yerleşik venv'i tercih edin: hedef python'un venv'i varsa, bunu kullanarak ortamı yaratacağız (ve daha sonra sunduğumuz diğer garantileri kolaylaştırmak için daha sonra işlemler yapacağız)

Sonuç:

Bu nedenle, iki rakip sanal zarf çözümü arasında gelecekteki bir yakınlaşma olacak gibi görünüyor, ancak şu andan itibaren pipenv - hangi kullanıyor virtualenv- önemli ölçüde değişiyor venv.

Pipenv'in çözdüğü sorunlar ve PyPA'nın nimetini verdiği gerçeği göz önüne alındığında , parlak bir geleceği var gibi görünüyor . Ve virtualenv önerilen geliştirme hedeflerini yerine getirirse , sanal bir zarf çözümü seçmek artık pipenv VEYA venv için bir durum olmamalıdır .


6
Anladığım kadarıyla: pipenv'in gerçek değeri bir süredir tartışıldı ve bir yıldan uzun süredir serbest bırakılmadı. O zamandan beri birçok şey değişti ve bunun pipenv için daha da kötüleştiğini iddia ediyorum ( şiir ve pip araçları gibi araçlar çok daha iyi durumda). PyPA sayfalar eskimiş ve onlar indirgemek gerekir iddia ediyorum pipenv . venv standart bir araçtır ve bu nedenle çok etkilidir, ancak sınırlı bir özelliklere sahiptir. virtualenv venv ile rekabet etmez, ancak venv'in gidemeyeceği veya gitmek istemediği alanları kapsamaya çalışır (standart olduğu için).
sinoroc

@sinoroc Benim sonrası yararları veya pipenv ilgili değildi., O PyPA ait çelişkili rehberliği hem pipenv onaylamadan ilgiliydi VE venv bir zarf çözümün seçimi daha zor hale ve yakınsama bir dereceye nasıl görüneceğini belirlemek için zorunluluğunu ortadan kaldıran olacak aralarında hiç. Hiçbir şeyi onaylamadığımı, PyPA tarafından onaylanan bu iki çözümün nasıl geliştiğiyle ilgili öğrendiklerimi paylaştığımı unutmayın . Onlar gibi ya da değil alakasız olur I olsun, onlarda PyPA ilgisi Verilen: pipenv ve venv gibiydi olasılıkla manzaranın bir parçası haline
F1Linux

8
Ben mümkün olduğunca venv ve pip sopa söyleyebilirim . Bu ikisi kalmak için burada, venv Python'un standart kütüphanesinin bir parçası ve Python'da ( ensurepip aracılığıyla) satıldığı için bir anlamda pip . Diğer araçları ( pyenv : aç veya taklit (az ya da çok başarı ile) güvenmek kenara serisi farklı bir şey tamamen) görünmektedir venv ve pip . Hangi harika. Ancak işler kötüye giderse , venv ve pip güvenli bir geri dönüş. Kullandığım diğer tek araç tox ( tox-venv ile)) sanal ortamlar oluşturmaya ve doldurmaya yardımcı olmak için (açık, sihir yok, henüz bahsedilmediği garip).
sinoroc

2
Bu son yazı, kırışıklıkları gidermede harika bir iş çıkardığı için altındır. Ben sistem python yükseltildiğinde Virtualenv kullanarak sarkan ikili ile sorunları vardı pip ve venv yapışmasını.
codeviper

1
geçmişte hataları pipenv nonverbose ile ilgili sorunlar koştu. argl ve hendek. Ayrıca: chriswarrick.com/blog/2018/07/17/...
qrtLs

3

Nisan 2020 Güncellemesi

Ben karşıdan karşıya geldiğimde aynı arıyordu bu yazı . Hangi aracın kullanılacağına dair bu sorunun benim gibi yeni Python kullanıcıları için oldukça karmaşık ve zor olduğunu düşünüyorum. Bu doğrudan Pipenv ile ilgili PyPA web sitesinden:

Bu öğretici, pipenv projesini, Python kitaplığı geliştirmesinden ziyade öncelikle Python uygulama geliştirme ihtiyaçlarına odaklanan bir araç olarak ele alırken, projenin kendisi şu anda hata düzeltmelerini ve yeni özelliklerin yayınlanmasını önleyen çeşitli işlem ve bakım sorunları üzerinde çalışıyor ( 2019'un tamamı yeni bir sürüm olmadan geçiyor). Bu, yakın vadede pipenv'in, bu isseslerin çözümü için net bir zaman çizelgesi olmadan hala birkaç tuhaflık ve performans probleminden muzdarip olduğu anlamına gelir.

Durum böyle olsa da, proje yöneticilerinin pipenv yerine veya onunla birlikte kullanılmak üzere Uygulama Bağımlılığı Yönetimi için Diğer Araçları araştırmak istemeleri muhtemeldir.

Nisan 2020 pipenv sürümünün planlandığı gibi devam ettiği ve bundan sonraki sürümün de yolda kaldığı varsayıldığında, öğreticideki bu uyarı kaldırılacaktır. Bu sürümler yolda kalmazsa, öğreticinin kendisi kaldırılır ve mevcut bağımlılık yönetimi seçenekleriyle ilgili bir tartışma sayfasıyla değiştirilir.


Görünüşe göre pipenv şu anda (yani Mayıs 2020'de) Nisan 2020 sürümü için hala ön sürümde. Buraya bakın .
andrewjames

Bu soruya cevap vermiyor.
Flimm

Bence @Flimm soruları iyi yanıtladı. F1Linux'un cevabına cevap veriyordum
Arnuld

1
4 Haziran 2020'den itibaren pipenvekip PyPI'ye 2 versiyon daha yayınladı: 2020.5.28ve daha yakın zamanda 2020.6.2: pypi.org/project/pipenv/#history
nonbeing
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.