Özel kod bir virtualenv'de nereye gider?


107

Kullanılırken ne tür bir dizin yapısı izlenmelidir virtualenv? Örneğin, bir WSGI uygulaması oluşturuyorsam ve adında bir virtualenv oluştursaydım, foobarşöyle bir dizin yapısıyla başlardım:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}

Bu ortam oluşturulduktan sonra, biri kendi başına nereye yerleştirilir:

  • python dosyaları?
  • statik dosyalar (resimler / vb.)?
  • İnternette bulunabilen ancak peynirci dükkanında bulunmayanlar gibi "özel" paketler?

ile ilgili olarak virtualenvdizinleri?

( Virtualenv dizinlerinin nereye gitmesi gerektiğini zaten bildiğimi varsayın .)


8
@jkp: Katılmıyorum. Bir python uygulamasını nasıl düzenlediğiniz, bu uygulamayı geliştirme amacıyla bir virtualenv içinde nasıl konumlandırdığınızdan farklı bir konudur. İlişkili ama aynı değil. Lütfen kopya olarak kapatmayın.
jcdyer

Yanıtlar:


90

virtualenvbir uygulama örneği değil, bir python yorumlayıcı örneği sağlar. Normalde uygulama dosyalarınızı sistemin varsayılan Python'unu içeren dizinlerde oluşturmazsınız, aynı şekilde uygulamanızı bir virtualenv dizini içinde bulmanız gerekmez.

Örneğin, aynı virtualenv'i kullanan birden çok uygulamanızın olduğu bir projeniz olabilir. Veya, daha sonra bir Python sistemiyle konuşlandırılacak olan bir virtualenv ile bir uygulamayı test ediyor olabilirsiniz. Veya, virtualenv dizininin uygulama dizininin içinde bir yere yerleştirilmesinin mantıklı olabileceği bağımsız bir uygulamayı paketliyor olabilirsiniz.

Yani genel olarak sorunun tek bir doğru cevabı olduğunu düşünmüyorum. Ve iyi bir şey virtualenv, birçok farklı kullanım durumunu desteklemesidir: tek bir doğru yol olmasına gerek yoktur.


8
Kabul. Yaptığım her şey için virtualenv kullanıyorum ve asla virtualenv dizininin içine dosya yerleştirmiyorum. Virtualenv'in proje yapınız üzerinde hiçbir etkisi yoktur; sadece virtualenv'i etkinleştirin (veya bin / python kullanın) ve dosyalarınız üzerinde nerede olursanız olun üzerinde çalışın.
Carl Meyer

Ben de tüm kalbimle katılıyorum. Sadece zaman ben hiç benim virtualenv (I kullanımı içindeki tüm dosyaları dokunmak virtualenvwrapperBen düzenlemek istediğinizde) 'dir postactivateve postdeactivatekanca.
Thane Brimhall

Soru, bu sorudaki diğer yanıtlarda görüldüğü gibi, değiş tokuşlar dahil olmak üzere farklı seçeneklerin somut, pratik örnekleriyle daha iyi işlenecektir.
andyfeller

2
Projenizi dizinden ayrı tutmak daha temizdir virtualenv, ancak virtualenvsistem python ile karşılaştırmak yararsızdır, çünkü amacı virtualenvbozuk bağımlılıkları düzeltmek ve projeleri farklı paket sürümlerini ve hatta python sürümlerini kullanabilmeleri için izole etmektir (bunun önceden yazılmış olduğunu anladım. -python3). Uygulamaların bir paylaşmasına izin virtualenvkullanıyor virtualenvsistem piton sanki çözmek için tasarlanmıştır Virtualenv aynı konulara karşı savunmasız uygulamalar bırakarak. There should be one obvious way to do it; mantıksal olarak 1: 1 olmalıdır
Davos

@Ned: Bazı en iyi uygulamaları edinmeye çalışıyorum, ancak hala belirsiz: Her biri kendi virtualenv'ine sahip düzinelerce projeniz varsa, hangi projenin hangi virtualenv ile kullanıldığını nasıl takip edebilirsiniz? Her klasörün köküne, birlikte kullandığınız virtualenv'in adıyla küçük kabuk komut dosyaları eklensin mi?
ccpizza

57

Her seferinde yalnızca birkaç projeniz varsa, hiçbir şey sizi her biri için yeni bir sanal ortam oluşturmaktan ve paketlerinizi doğrudan içine koymaktan alıkoyamaz:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py

Bu yaklaşımın avantajı, içindeki projeye ait olan etkinleştirme komut dosyasını bulacağınızdan her zaman emin olabilmenizdir.

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>

Biraz daha organize olmaya karar verirseniz, tüm sanal ortamlarınızı tek bir klasöre koymayı ve her birine üzerinde çalıştığınız projenin adını vermeyi düşünmelisiniz.

  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py

Bu şekilde, işler ters gittiğinde her zaman yeni bir virtualenv ile yeniden başlayabilirsiniz ve proje dosyalarınız güvende kalır.

Diğer bir avantaj ise, projelerinizin birçoğunun aynı virtualenv'i kullanabilmesidir, bu nedenle çok fazla bağımlılığınız varsa aynı kurulumu tekrar tekrar yapmanız gerekmez.

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>

Düzenli olarak virtualenv'leri kurması ve sökmesi gereken kullanıcılar için virtualenvwrapper'a bakmak mantıklı olacaktır.

http://pypi.python.org/pypi/virtualenvwrapper

Virtualenvwrapper ile şunları yapabilirsiniz:

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

Artık "foo" ve "bar" projeleri üzerinde çalışırken sanal ortamlarınızın nerede olduğu konusunda endişelenmenize gerek yok:

  /foo
    /mypackage1
      __init__.py
  /bar
    /mypackage2
      __init__.py

"Foo" projesi üzerinde çalışmaya şu şekilde başlarsınız:

$ cd foo
$ workon
bar
foo
$ workon foo
(foo)$ python
>>> import mypackage1
>>>

Ardından "bar" projesine geçiş şu kadar basit:

$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>

Oldukça temiz, değil mi?


Kullanımla ilgili bu cevaba kesinlikle katılıyorum virtualenvwrapper. Size tüm faydaları sunarken sanal ortamı özenle soyutlar.
Thane Brimhall

5
Ancak, ASLA kodunuzu sanal ortama koyma konusunda kesinlikle katılmıyorum . Dosya sistemindeki projenin "yakınında" olmasını istiyorsanız, o zaman projeninki ile venv/aynı seviyeye bir dizin koyun BASE_DIR.
Rob Grant

30

Virtualenv'ler yeniden konumlandırılamadığından, bence proje dosyalarınızı virtualenv dizini içine yerleştirmek kötü bir uygulamadır. Virtualenv'in kendisi, projenin bir parçası değil, oluşturulmuş bir geliştirme / dağıtım yapısıdır (bir çeşit .pyc dosyası gibi); herhangi bir zamanda onu uçurup yeniden oluşturmak veya yeni bir dağıtım ana bilgisayarında yeni bir tane oluşturmak vb. kolay olmalıdır.

Aslında kullanımı pek çok kişi virtualenvwrapper varsayılan olarak hepsini yan-yana $ HOME / .virtualenvs yerleştirerek, neredeyse tamamen farkındalık gerçek virtualenvs kaldırır.


Bunun kötü bir uygulama olduğuna tamamen katılıyorum, özellikle dağıtımları test etmek ve gereksiz gereksinimleri ortadan kaldırmak için patlatmanın ve yeniden yaratmanın kolay olması gerektiğine işaret etmek harika. Sadece virtualenv'in yeniden konumlandırılmasının mümkün olduğunu eklemek istiyorum, örneğin stackoverflow.com/a/6628642/1335793'evirtualenv --relocatable myvenv bakın, çünkü bunu yapmanız gerektiği anlamına gelmez.
Davos

2

Projenize bir verirseniz setup.py, pip onu doğrudan sürüm kontrolünden içe aktarabilir.

Bunun gibi bir şey yapın:

$ virtualenv --no-site-packages myproject
$ . myproject/bin/activate
$ easy_install pip
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj

Bu -e, projeyi yerleştirecek myproject/src, ancak ona bağlanacak myproject/lib/pythonX.X/site-packages/, böylece yaptığınız herhangi bir değişiklik, onu yerelinizden içe aktaran modüllerde hemen alınacaktır site-packages. #eggBiraz bunu sizin için oluşturduğu yumurta paketine vermek istiyorum adının ne pip söyler.

Eğer kullanmıyorsanız --no-site-packages, sen pip ile virtualenv içine yüklemek istediğinizi belirtmek için dikkatli olmak -Eseçeneğiyle

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.