Python-Import des lokalen Moduls schlägt fehl, wenn es als systemd / systemctl-Dienst ausgeführt wird

9

Ich habe eine Python-Anwendung, die ich als Systemdienst ausführen möchte. Die Anwendung läuft gut, wenn ich es manuell ausführe. Wenn ich es als Dienst starte, findet es kein lokales Modul, das mit pip install -e my_module installiert wurde.

Der Hauptteil der Anwendung hat den folgenden Code:

%Vor%

Wenn ich es manuell ausführe, bekomme ich (beachte, dass my-mod in der zweiten Zeile in 'Installierte Pakete' enthalten ist):

%Vor%

Wenn Sie den Service durchlaufen, sehen die Protokolle folgendermaßen aus (Beachten Sie, dass my-mod NICHT in der zweiten Zeile von 'Installierte Pakete' enthalten ist) ::

%Vor%

Dies könnte auch eine nützliche Information sein:

%Vor%

Bearbeiten:

Wie Sie der Ausgabe von 'installed_packages' entnehmen können, werden alle anderen Pakete, die über die requirements.txt installiert werden, korrekt gefunden. Nur diese eine Bibliothek, für die ich Quellcode lokal habe, wird nicht gefunden, wenn ich als Dienst ausgeführt werde. (Es wird gefunden, wenn ich von der Befehlszeile aus laufe oder wenn ich import my_mod vom Python3-Interpreter aus führe.

    
user1753106 26.02.2016, 00:56
quelle

5 Antworten

5

Ich hatte ein sehr ähnliches Problem, indem ich einen Upstart heartbeat.conf in ein systemd heartbeat.service umwandelte, außer mit dem requests Modul. Die Lösung bestand darin, im neuen Dienst anzugeben, welcher Benutzer es ausführen soll:

%Vor%

Ohne die User=user , kam ich in die journalctl:

%Vor%     
TemporalWolf 11.10.2016 22:21
quelle
0

Versuchen Sie zuerst Folgendes in der Python-Eingabeaufforderung.

%Vor%

Fix 1

Wenn Sie die obige Art der Ausgabe erhalten, liegt die Ursache möglicherweise am Berechtigungsproblem. Gewähren Sie die Berechtigung für Site-Pakete mit den folgenden.

%Vor%

Fix 2

Versuchen Sie, den PYTHONPATH wie folgt zu exportieren:

%Vor%

Fix 3

Überprüfen Sie, ob mehrere Versionen von Python auf demselben Computer laufen.

Wenn ja, prüfen Sie, ob Sie am Anfang des Codes den richtigen Interpreter haben, wie #!/usr/bin/python

    
Naga2Raja 26.02.2016 01:46
quelle
0

1) Installieren Sie das supervisor -Paket ( ausführlichere Anweisungen hier ):

%Vor%

2) Erstellen Sie eine Konfigurationsdatei für Ihren Daemon unter /etc/supervisor/conf.d/my_mod.conf :

%Vor%

3) Starten Sie supervisor neu, um Ihre neue .conf

zu laden %Vor%     
Hexoul 26.02.2016 02:04
quelle
0

Ich hatte das gleiche Problem. Ich dachte, pip install muss benutzerspezifisch sein.
Also wechselte ich zu root und installierte dann die Pakete. Es hat danach funktioniert.

Ich denke jedoch, dass die Angabe von User=myUser in der Servicedatei ein geeigneterer Weg wäre, aber ich wollte, dass es mit root-Berechtigungen ausgeführt wird, und ich war mir nicht sicher, ob ich den Benutzer angeben werde.

Ich hoffe, es hilft jemandem

    
Dushyant Bangal 27.04.2017 09:32
quelle
0

Wenn Sie den Dienst als root ausführen möchten, müssen Sie das Modul mit sudo: sudo pip install my_module .

installieren     
Sjaak van de Hoek 03.02.2018 20:50
quelle

Tags und Links