Python-Skript kann mit systemd nicht als Daemon ausgeführt werden – Kein Modul mit dem Namen „oandapyV20“

Python-Skript kann mit systemd nicht als Daemon ausgeführt werden – Kein Modul mit dem Namen „oandapyV20“

Ich versuche, ein Python-Skript mit systemd zu daemonisieren, erhalte aber nach der Aktivierung des Daemons ständig die Fehlermeldung „Kein Modul mit dem Namen ‚oandapyV20‘“.

Das Skript befindet sich am Speicherort: /home/user/workingdir/script.py

Die virtuelle Umgebung befindet sich unter: /home/user/venv/bin/

Aus den gefundenen Dokumenten kann ich am besten wie folgt raten, wie der Dienst aufgebaut werden kann:

[Unit]
Description=DataLoader
[Service]
User=root
Group=root
WorkingDirectory=/home/user/workingdir
ExecStart=/home/user/venv/bin/python3 script.py
[Install]
WantedBy=multi-user.target

Was funktioniert...

python3 script.py

oder Aktivierung der virtuellen Umgebung

Quelle /home/Benutzer/venv/bin/aktivieren; python3 script.py

Obwohl das außerhalb des Dienstes funktioniert, funktioniert nichts, was ich versucht habe, beim Aufruf von systemd.

Was mache ich falsch? Was ist mir nicht klar?

Endgültige Lösung (mit wenig Verständnis)

[Unit]
Description=DataLoader
[Service]
User={user_name}
Group={user_name}
WorkingDirectory=/home/{user_name}/workingdir
ExecStart=/usr/bin/python3 script.py
Restart=always
[Install]
WantedBy=multi-user.target

Antwort1

Sie sind offenbar davon ausgegangen, dass bei jedem Aufruf source /home/user/venv/activateder python3Befehl (und der pip3Befehl) anschließend die entsprechende ausführbare Datei von aufrufen würde /home/user/venv/bin.

Die Klarstellung, die Sie in den Kommentaren hinzugefügt haben, zeigt jedoch, dass diese Annahme falsch war. Sie haben Python nicht aus Ihrer virtuellen Umgebung aufgerufen, als Sie ausgeführt haben script.py; Sie haben Python aufgerufen /usr/bin(und anscheinend auch entsprechend pip, da das Python in Ihrer virtuellen Umgebung das Modul nicht installiert zu haben scheint oandapyV20, während das System-Python das Modul installiert hat).

Untersuchen Sie die Ausgabe von

echo $PATH
echo $PYTHONPATH

Die $PATHUmgebungsvariable ist eine durch Doppelpunkte getrennte Liste von Pfaden auf Ihrem System, die bei der Eingabe eines Befehls durchsucht werden sollen. Entweder /home/user/venv/binist sie nicht in der Liste vorhanden oder sie tritt nach einem Vorkommen von auf /usr/bin, das eine Übereinstimmung für enthält python3( $PATHdie Suche wird nach der ersten Übereinstimmung beendet.) $PATHwird normalerweise von gesetzt $HOME/.bashrc(oder /etc/bashrcwenn nicht dort gesetzt) ​​und wäre, wenn Ihre Annahme richtig gewesen wäre, /home/user/venv/activateso gesetzt worden , $PATHdass es ihr vorangestellt wird /home/user/venv/bin.

$PYTHONPATHsollte Python mitteilen, wo nach zu ladenden Modulen gesucht werden soll. (Es kann auch mit geändert oder aus Ihrem Skript gelesen werden sys.path.)

Das erklärt, warum die Änderung des Befehls Ihrer Systemd-Einheit funktioniert hat – es ruft endlich dasselbe Python auf wie Ihr Arbeitsbefehl.

verwandte Informationen