Virtuelle Python Environments Update
Virtual Environments sind isolierte und unabhängige Umgebungen, die den Code und die Abhängigkeiten eines Projekts enthalten. Mit virtuellen Environments kann man parallel Umgebungen schaffen, in denen zum Beispiel Python Packages in unterschiedlichen Versionen installiert sind.
Falls auf dem Computer mehrere Python Versionen installiert sind, ist es auch möglich parallel Umgebungen zu schaffen, die unter unterschiedlichen Python Versionen laufen. Dieses ist besonders hilfreich, wenn man bei der Entwicklung von SmartHomeNG oder von Plugins testen möchte, wie sich SmartHomeNG (bzw. das Plugin) unter verschiedenen Python Versionen verhält.
Es gibt eine Reihe von Tools, um virtuelle Environments zu erstellen. Die verbreitetesten Tools sind virtualenv und venv.
venv gibt es seit Python 3.3. Es ist Bestandteil der Python Installation. Allerdings ist es in einigen Umgebungen (z.B. älteren Debian Distributionen) nicht in der Standard Python Installation enthalten und muss dann separat installiert werden.
virtualenv bietet eine größere Funktionalität als venv. Die Funktionalität von venv ist eine Untermenge der Funktionalität von virtualenv. virtualenv ist Vergleich zu venv schneller und es ist erweiterbar. Für den Einsatz im Kontext von SmartHomeNG wird diese größere Funktionalität jedoch nicht benötigt.
Da venv Teil der Python Distribution ist, wird empfohlen diesem den Vorzug vor virtualenv zu geben. Im Folgenden wird auch nur vom Einsatz von venv ausgegangen.
Die virtuellen Environments werden standardmäßig im Unterverzeichnis venvs
des SmartHomeNG Basisverzeichnises
gespeichert. Außer den virtuallen Environments enthält das Verzeichnis auch Skripte zur Verwaltung der
virtuellen Environments.
Das postinstall Skript der SmartHomeNG Installation nimmt dieses Verzeichnis in den Pfad auf, so dass die Skripte ohne Pfadangabe aufgerufen werden können.
Installation von venv bzw. virtualenv
venv bzw. virtualenv wird am besten unter der Python Version installiert, für die später virtuelle Environments erstellt werden sollen. (venv ist bei aktuellen Distributionen bereits auf dem System installiert) Um zum Beispiel ein virtual Environment für Python 3.10 zu erstellen, ist der folgende Befehl auszuführen:
$ pip3.10 install venv
bzw.
$ pip3.10 install virtualenv
Erstellung von virtuellen Environments
Jetzt kann mit dem folgenden Befehl ein virtual Environment erstellt werden, welches den Namen py_3.10 trägt:
$ make_venv 3.10
Während der Anlage wird das Environment aktiviert, um einige norwendige Python Packages in das Environment zu installieren bzw. zu aktualisieren.
Das Environment wird mit dem Kommando
$ source act 3.10
aktiviert.
In dem Environment sind nun nur die Packages pip, setuptools und evtl. wheel installiert. Weitere benötigte Packages können ganz normal mit pip3 nachinstalliert werden. (SmartHomeNG installiert wie bei einer kompletten Neuinstallation die benötigten Packages).
Der Aufruf von
(py_3.10) $ python3
führt nun dazu, dass Python 3.10 gestartet wird.
Um das virtuelle Environment zu deaktivieren, muss nur
(py_3.10) $ deactivate
eingegeben werden.
Löschen eines virtuellen Environment
Wenn ein virtuelles Environment nicht mehr benötigt wird, wird einfach das entsprechende Verzeichnis rekirsiv gelöscht.
Bitte darauf achten, dass das Environment nicht aktiv ist. Bei Bedarf vor dem Löschen mit dem Befehl deactivate
deaktivieren.
$ cd /usr/local/smarthome/venvs
$ rm -r py_3.10
Virtuelle Environements als Dienst
Wenn SmartHomeNG als Dienst eingerichtet werden und in einem virtuellen Environment laufen soll, muss die xxx-Datei im Vergleich zur Beschreibung in der Komplettanleitung abgeändert werden. Es muss der Pfad zu Python in dem entsprechenden Environment angegeben werden.
Zum Einrichten den Texteditor starten mit
sudo nano /etc/systemd/system/smarthome.service
und folgenden Text hineinkopieren:
[Unit]
Description=SmartHomeNG daemon
After=network.target
After=knxd.service
After=knxd.socket
[Service]
Type=forking
ExecStart=/usr/local/smarthome/venvs/py_310/bin/python3 /usr/local/smarthome/bin/smarthome.py
WorkingDirectory=/usr/local/smarthome
User=smarthome
PIDFile=/usr/local/smarthome/var/run/smarthome.pid
Restart=on-failure
TimeoutStartSec=900
RestartForceExitStatus=5
[Install]
WantedBy=default.target