Wohin in einer virtuellen Umgebung geht der benutzerdefinierte Code?

107

Welche Art von Verzeichnisstruktur sollte man bei der Verwendung befolgen virtualenv? Wenn ich beispielsweise eine WSGI-Anwendung erstellen und eine virtuelle Umgebung mit dem Namen erstellen foobarwürde, würde ich mit einer Verzeichnisstruktur wie der folgenden beginnen:

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

Wenn diese Umgebung einmal erstellt ist, wo würde man ihre eigene platzieren:

  • Python-Dateien?
  • statische Dateien (Bilder / etc)?
  • "benutzerdefinierte" Pakete, wie sie online erhältlich sind, aber nicht im Käsegeschäft erhältlich sind?

in Bezug auf die virtualenvVerzeichnisse?

(Angenommen, ich weiß bereits, wohin die Verzeichnisse von virtualenv selbst gehen sollen .)

Phillip B. Oldham
quelle
8
@jkp: Ich bin anderer Meinung. Das Layout einer Python-Anwendung unterscheidet sich von der Art und Weise, wie Sie diese Anwendung zu Entwicklungszwecken in einer virtuellen Umgebung suchen. Es ist verwandt, aber nicht dasselbe. Bitte nicht als Duplikat schließen.
JCDyer

Antworten:

90

virtualenvBietet eine Python-Interpreter-Instanz, keine Anwendungsinstanz. Normalerweise würden Sie Ihre Anwendungsdateien nicht in den Verzeichnissen erstellen, die das Standard-Python eines Systems enthalten. Ebenso ist es nicht erforderlich, Ihre Anwendung in einem virtuellen Env-Verzeichnis zu suchen.

Beispielsweise haben Sie möglicherweise ein Projekt, in dem mehrere Anwendungen dieselbe virtuelle Umgebung verwenden. Oder Sie testen eine Anwendung mit einer virtuellen Umgebung, die später mit einem System-Python bereitgestellt wird. Oder Sie packen möglicherweise eine eigenständige App, in der es möglicherweise sinnvoll ist, das Verzeichnis virtualenv irgendwo im App-Verzeichnis selbst zu haben.

Im Allgemeinen glaube ich nicht, dass es eine richtige Antwort auf die Frage gibt. Und das Gute daran virtualenvist, dass es viele verschiedene Anwendungsfälle unterstützt: Es muss keinen richtigen Weg geben.

Ned Deily
quelle
8
Einverstanden. Ich verwende virtualenv für alles, was ich tue, und platziere niemals Dateien im virtualenv-Verzeichnis. Virtualenv muss keine Auswirkungen auf Ihre Projektstruktur haben. Aktivieren Sie einfach die virtuelle Umgebung (oder verwenden Sie deren bin / python) und bearbeiten Sie Ihre Dateien, wo immer Sie sie haben möchten.
Carl Meyer
Ich stimme auch voll und ganz zu. Das einzige Mal , dass ich jemals berühren alle Dateien in meinem virtualenv (ich benutze virtualenvwrapper) ist , wenn ich das zu bearbeitende postactivateund postdeactivateHaken.
Thane Brimhall
Die Frage wäre besser mit konkreten, praktischen Beispielen für verschiedene Optionen zu bedienen, einschließlich Kompromissen, wie aus anderen Antworten in dieser Frage hervorgeht.
Andyfeller
2
Es ist sauberer, Ihr Projekt vom virtualenvVerzeichnis getrennt zu halten , aber ein Vergleich virtualenvmit Systempython ist nicht hilfreich, da der Zweck darin virtualenvbesteht, defekte Abhängigkeiten zu beheben und Projekte zu isolieren, damit sie verschiedene Paketversionen und sogar Pythonversionen verwenden können (mir ist klar, dass dies bereits geschrieben wurde) -python3). Zulassen von Anwendungen eines teilen virtualenvist mit , virtualenvals ob es System Python war, Apps anfällig für die gleichen Probleme verlassen virtualenv ausgelegt ist zu lösen. There should be one obvious way to do it;; logischerweise sollte das 1: 1 sein
Davos
@Ned: Der Versuch, einige Best Practices zu erwerben, ist jedoch noch unklar: Wenn Sie Dutzende von Projekten haben, von denen jedes seine eigene virtuelle Umgebung hat, wie können Sie dann verfolgen, welches Projekt mit welcher virtuellen Umgebung verwendet wird? Fügen Sie im Stammverzeichnis jedes Ordners winzige Shell-Skripte mit dem Namen der virtuellen Umgebung hinzu, mit der Sie sie verwenden.
ccpizza
57

Wenn Sie nur ab und zu nur wenige Projekte haben, hindert Sie nichts daran, für jedes eine neue virtuelle Umgebung zu erstellen und Ihre Pakete direkt darin abzulegen:

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

Der Vorteil dieses Ansatzes besteht darin, dass Sie immer sicher sein können, das Aktivierungsskript zu finden, das zum darin enthaltenen Projekt gehört.

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

Wenn Sie sich für eine etwas bessere Organisation entscheiden, sollten Sie in Betracht ziehen, alle Ihre virtuellen Umgebungen in einem Ordner abzulegen und sie nach dem Projekt zu benennen, an dem Sie arbeiten.

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

Auf diese Weise können Sie immer mit einer neuen virtuellen Umgebung beginnen, wenn etwas schief geht, und Ihre Projektdateien bleiben sicher.

Ein weiterer Vorteil ist, dass mehrere Ihrer Projekte dieselbe virtuelle Umgebung verwenden können, sodass Sie nicht immer wieder dieselbe Installation durchführen müssen, wenn Sie viele Abhängigkeiten haben.

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

Für Benutzer, die regelmäßig virtuelle Umgebungen einrichten und abbauen müssen, ist es sinnvoll, sich virtualenvwrapper anzusehen.

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

Mit virtualenvwrapper können Sie

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

Sie müssen sich keine Gedanken mehr darüber machen, wo sich Ihre virtuellen Umgebungen befinden, wenn Sie an den Projekten "foo" und "bar" arbeiten:

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

So fangen Sie an, am Projekt "foo" zu arbeiten:

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

Dann ist das Umschalten auf Projekt "Leiste" so einfach:

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

Ziemlich ordentlich, nicht wahr?

Maik Röder
quelle
Ich stark stimme mit dieser Antwort über die Verwendung virtualenvwrapper. Es abstrahiert die virtuelle Umgebung sauber und bietet Ihnen dennoch alle Vorteile.
Thane Brimhall
5
Sie sind sich jedoch nicht einig darüber, ob Sie Ihren Code jemals in die virtuelle Umgebung einfügen. Wenn Sie möchten, dass es sich "in der Nähe" des Projekts im Dateisystem befindet, legen Sie ein venv/Verzeichnis auf derselben Ebene wie das des Projekts ab BASE_DIR.
Rob Grant
30

Da virtualenvs nicht verschiebbar sind, ist es meiner Meinung nach eine schlechte Praxis, Ihre Projektdateien in einem virtualenv-Verzeichnis abzulegen. Die virtuelle Umgebung selbst ist ein generiertes Entwicklungs- / Bereitstellungsartefakt (ähnlich einer .pyc-Datei), das nicht Teil des Projekts ist. Es sollte einfach sein, es wegzublasen und jederzeit neu zu erstellen oder ein neues auf einem neuen Bereitstellungshost usw. zu erstellen.

Tatsächlich verwenden viele Benutzer virtualenvwrapper , wodurch die tatsächlichen virtualenvs fast vollständig aus Ihrem Bewusstsein entfernt werden und standardmäßig alle nebeneinander in $ HOME / .virtualenvs platziert werden.

Carl Meyer
quelle
Stimmen Sie voll und ganz zu, dass es eine schlechte Praxis ist, und weisen Sie darauf hin, dass es einfach sein sollte, sie wegzublasen und neu zu erstellen, insbesondere zum Testen von Bereitstellungen und zum Wegschneiden nicht benötigter Anforderungspakete. Ich möchte nur hinzufügen, dass die Verlagerung von virtualenv möglich ist, z. B. virtualenv --relocatable myvenvsiehe stackoverflow.com/a/6628642/1335793, nur weil Sie können, heißt das nicht, dass Sie es sollten.
Davos
2

Wenn Sie Ihrem Projekt eine geben setup.py, kann pip es direkt aus der Versionskontrolle importieren.

Mach so etwas:

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

Das -eProjekt wird eingefügt myproject/src, aber mit verknüpft myproject/lib/pythonX.X/site-packages/, sodass alle Änderungen, die Sie vornehmen, sofort in Modulen übernommen werden, die es von Ihrem lokalen Standort importieren site-packages. Das #eggBit teilt pip mit, welchen Namen Sie dem Eierpaket geben möchten, das es für Sie erstellt.

Wenn Sie nicht verwenden --no-site-packages, geben Sie sorgfältig an, dass pip mit der -EOption in virtualenv installiert werden soll

jcdyer
quelle