Beim Entwicklen von Python Projekten, setzt man meistens auch zusätzliche Module ein, die zuerst installiert werden müssen. Eine Möglichkeit ist, diese einfach global im Betriebsystem zu installieren. Eine gute Idee ist dies jedoch nicht. Besser ist es, diese direkt an das Projekt zu binden. So kommt man sich auch nicht mit anderen Projekten in die quere und kann unterschiedliche Versionen in unterschiedlichen Projekten einsetzen. Auch dritte können dann einfacher das Projekt bei sich installieren.
Eine Möglichkeit hierzu wäre Docker. Aber auch Python direkt hat was im Angebot, worum es hier geht. Das Virtuelle Environment.
Installation
Mit pip3 muss nur einmalig virtualenv installiert werden:
pip3 install virtualenv
Erzeugen eines Environments
Pro Projekt kann nun die Umgebung erzeugt werden. Dazu wechselt man zunächst in das Projektverzeichnis, um dort das folgende Auszuführen. X wird hier durch die gewünschte Versionsnummer ersetzt. Tab completion hilft:
virtualenv --no-site-packages --distribute -p /usr/bin/python3.X ENV
Mac User finden ihren Python Interpreter in /usr/local/bin. Was nun angelegt wurde ist der Ordner ENV, welcher alle Module und Pakete enthält, welche wir nun installieren. Dazu müssen wir das Environment aber zunächst noch starten.
Verwenden des Environments
Im Projektfolder, führ man folgendes Kommando aus:
source ENV/bin/activate
Ab nun können wir in dieser Umgebung arbeiten. Der Python Interpreter ist nun auch automatisch auf den beim anlegen angegebenen gesetzt und anstelle pip3 kann pip verwendet werden.
Zum beenden des Environments reicht folgendes Kommando:
deactivate
Ein Tipp, den ENV Folder würde ich nicht in die Versionskontrolle des Projektes aufnehmen.
Tipp zu Paketen
Kleiner Tipp, alle Pakete die im Environment mit pip installiert wurden, können einfach angezeigt werden:
pip freeze
Die Ausgabe dieses Kommandos kann ganz einfach in eine Datei, z.B. requirements.txt umgeleitet werden.
Und mit dieser Datei, kann man ein frisches Environment einfacher aufsetzten:
pip install -r requirements.txt
Deploy mit UWSGI
Das Environement kann auch ziemlich einfach mit UWSGI verwendet werden. Notwendig dazu ist eine uwsgi.ini file:
[uwsgi] plugin = python3 wsgi-file = /var/MEINPROJEKT/app.wsgi processes = 8 enable-threads = true callable = app
Sowie ein kleines Script, welches die Application zur Verfügung stellt, Beispielsweise beim Flask (app.wsgi):
#!/usr/bin/python3 activate_this = '/var/MEINPROJEKT/ENV/bin/activate_this.py'.format(domain) exec(open(activate_this).read(), dict(__file__=activate_this)) import sys,os sys.path.append("/var/MEINPROJEKT/htdocs") from application import app