![Python-Skript kann mit systemd nicht als Daemon ausgeführt werden – Kein Modul mit dem Namen „oandapyV20“](https://rvso.com/image/170267/Python-Skript%20kann%20mit%20systemd%20nicht%20als%20Daemon%20ausgef%C3%BChrt%20werden%20%E2%80%93%20Kein%20Modul%20mit%20dem%20Namen%20%E2%80%9EoandapyV20%E2%80%9C.png)
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/activate
der python3
Befehl (und der pip3
Befehl) 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 $PATH
Umgebungsvariable ist eine durch Doppelpunkte getrennte Liste von Pfaden auf Ihrem System, die bei der Eingabe eines Befehls durchsucht werden sollen. Entweder /home/user/venv/bin
ist sie nicht in der Liste vorhanden oder sie tritt nach einem Vorkommen von auf /usr/bin
, das eine Übereinstimmung für enthält python3
( $PATH
die Suche wird nach der ersten Übereinstimmung beendet.) $PATH
wird normalerweise von gesetzt $HOME/.bashrc
(oder /etc/bashrc
wenn nicht dort gesetzt) und wäre, wenn Ihre Annahme richtig gewesen wäre, /home/user/venv/activate
so gesetzt worden , $PATH
dass es ihr vorangestellt wird /home/user/venv/bin
.
$PYTHONPATH
sollte 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.