103 votes

Où va mon * code * dans virtualenv?

Quelle sorte de structure de répertoire doit-on suivre lors de l'utilisation d' virtualenv? Par exemple, si j'ai été de construire une application WSGI et créé un virtualenv appelés foobar je voudrais commencer par une structure de répertoire:

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

Une fois cet environnement est créé, où serait-on dans un lieu qui leur est propre:

  • fichiers python?
  • les fichiers statiques (images, etc)?
  • "personnalisée" des paquets, tels que ceux disponibles en ligne, mais pas trouvé dans le fromage-shop?

par rapport à l' virtualenv annuaires?

(À supposer que je sais déjà où le virtualenv répertoires eux-mêmes devrait aller.)

87voto

Ned Deily Points 40248

virtualenv fournit un interpréteur python, par exemple, pas une instance de l'application. Vous n'auriez pas normalement créer les fichiers de votre application dans les répertoires contenant un système par défaut de python, de même il n'y a aucune exigence pour localiser votre demande dans un virtualenv répertoire. Par exemple, vous pourriez avoir un projet pour lequel vous disposez de plusieurs applications utilisant la même virtualenv. Ou, vous avez peut-être tester une application avec un virtualenv qui sera par la suite déployé avec un système de python. Ou, vous avez peut-être empaquetage d'une application autonome où il pourrait être utile d'avoir le virtualenv répertoire situé quelque part dans le répertoire app elle-même. Donc, en général, je ne pense pas qu'il y est une seule bonne réponse à la question. Et, une bonne chose à propos de virtualenv , c'est qu'il prend en charge de nombreux différents cas d'utilisation: il n'a pas besoin d'être un droit.

55voto

Maik Röder Points 311

Si vous n'avez que quelques projets de chaque tellement souvent, rien ne vous empêche de créer un nouveau virtualenv pour chacun d'eux, et de mettre vos paquets à l'intérieur:

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

L'avantage de cette approche est que vous pouvez toujours être sûr de trouver des trouver des les activer script qui appartient à la projet à l'intérieur.

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

Si vous décidez d'être un peu plus organisé, vous devriez envisager de mettre tous vos virtualenvs dans un dossier, et le nom de chacun d'eux après le projet sur lequel vous travaillez.

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

De cette façon, vous pouvez toujours recommencer avec une nouvelle virtualenv quand les choses vont mal, et vos fichiers de projet à rester en sécurité.

Un autre avantage est que plusieurs de vos projets peuvent utiliser le même virtualenv, de sorte que vous n'avez pas à faire la même installation de plus de et plus si vous avez beaucoup de dépendances.

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

Pour les utilisateurs qui ont régulièrement à installer et à démonter virtualenvs il serait judicieux de regarder à virtualenvwrapper.

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

Avec virtualenvwrapper vous pouvez

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

Vous ne plus avoir à vous soucier de l'endroit où votre virtualenvs sont lorsque vous travaillez sur des projets "foo" et "bar":

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

C'est ainsi que vous commencez à travailler sur le projet "foo":

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

Puis en passant au projet "bar" est aussi simple que cela:

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

Plutôt intéressant, n'est-ce pas?

28voto

Carl Meyer Points 30736

Parce que virtualenvs ne sont pas délocalisables, à mon avis c'est une mauvaise pratique de placer vos fichiers de projet à l'intérieur d'un virtualenv répertoire. Le virtualenv lui-même est un générés développement/déploiement de l'artefact (un peu comme un .pyc fichier), ne fait pas partie du projet; il devrait être facile de l'emporter et de le recréer à tout moment, ou en créer un nouveau sur une nouvelle déployer d'accueil, etc.

Beaucoup de gens en fait, l'utilisation de virtualenvwrapper, qui supprime le réel virtualenvs de votre conscience presque complètement, en les plaçant tous les côte-à-côte dans $HOME/.virtualenvs par défaut.

2voto

jcdyer Points 7956

Si vous donner à votre projet un setup.py, pep, vous pouvez l'importer à partir de la version de contrôle directement.

Faire quelque chose comme ceci:

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

L' -e va mettre le projet en myproject/src, mais le lien d' myproject/lib/pythonX.X/site-packages/, de sorte que toutes les modifications apportées seront ramassés immédiatement dans des modules que l'importer à partir de votre local site-packages. L' #egg bit indique pip quel nom que vous souhaitez donner à l'œuf paquet qu'elle crée pour vous.

Si vous n'utilisez pas --no-site-packages, veillez à spécifier que vous souhaitez pip à installer dans le virtualenv avec l' -E option

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X