2016-07-22 5 views
4

Ich habe ein Python-Skript, das zmq verwendet und ich habe diese Bibliothek über pip install zmq installiert und ich kann das Programm fein ausführen, wenn manuell über die Befehlszeile aufgerufen. Doch sobald ich eine systemd Einheit rufen Sie das Skript haben, versuchen, laufen systemctl status myservice.service zeigt ImportError: No module named zmq.Das Ausführen von Python-Skript über Systemd kann nicht geladen werden

Meine Service-Datei sieht wie folgt aus:

[Unit] 
Description=Does Something 

[Service] 
Type=simple 
ExecStart=/bin/sh /var/lib/project/runpythonscript.sh 
Restart=always 

[Install] 
Alias=myservice.service 

Wo runpythonscript.sh ein sehr einfaches Shell-Skript, das mein Python-Skript als root läuft. manuell über die Befehlszeile dieses Shell-Skript läuft, läuft mein Python-Programm völlig in Ordnung, aber mit dem Service nennen es bewirkt, dass es nicht das zmq Modul lokalisieren.

Jede Hilfe wird geschätzt.

Antwort

5

systemd läuft als Wurzel. Die Module über pip installiert sind für einen Benutzer installiert und nicht für das System und die Installation so die Module ohne Root-Rechte, die Module unaccessible für root gemacht.

Um das zu lösen, habe ich sudo -H pip install zmq und sudo -H pip3 install zmq ausgeführt, um die Pakete für Python 2.7 und Python 3+ für root zu installieren. Dies ermöglichte systemd Zugriff auf die Module, sobald es versucht, das Python-Skript auszuführen.

2

Die wahrscheinlichste Erklärung ist, dass Sie einige Umgebungsvariablen (zum Beispiel eine Erweiterung Ihrer PYTHONPATH?) Haben, die nicht gesetzt ist, wenn das Skript von systemd ausgeführt wird.

Sie könnten versuchen, die Umweltparameter (siehe [0]) so eingestellt PYTHONPATH (und was sonst könnte dies beeinflussen), um was es in der Konsole-Sitzung.

[0] http://0pointer.de/public/systemd-man/systemd.exec.html#Environment=

+0

Thank you! Diese Antwort hat mir schließlich geholfen, mein Projekt nach stundenlanger Suche nach Antworten, die es nicht getan hat, in Gang zu bringen. – dtgee

0

In meinem Fall setze ich „EnvironmentFile =“ den Benutzer Bash_profile. Das Problem war, dass in Bash_profile hatte ich so etwas wie:

export PYTHONPATH=.... 
export PATH=.... 

Das ist nicht mit systemd gearbeitet und es musste geändert, es zu:

PYTHONPATH=.... 
PATH=.... 
export PYTHONPATH PATH