2016-02-26 10 views
8

Ich habe eine Python-Anwendung, die ich als Systemdienst ausgeführt habe. Die Anwendung läuft gut, wenn ich es manuell ausführe. Wenn ich es als Dienst ausführe, findet es kein lokales Modul, das mit pip install -e my_module installiert wurde.Python-Import des lokalen Moduls schlägt fehl, wenn es als Systemd/Systemctl-Dienst ausgeführt wird

Der Haupt der Anwendung hat die folgenden Code:

print(sys.argv) 
import pip 
installed_packages = pip.get_installed_distributions() 
installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages]) 
print(installed_packages_list) 
print('doing tox') 
import tox 
print('doing my_mod') 
import my_mod 
print(my_mod.__file__) 
from my_mod.auth.http_auth_provider import HTTPAuthProvider 

Wenn ich es manuell ausführen, bekomme ich (beachten Sie, dass my-Mod ist in der zweiten Zeile sind in ‚installierten Pakete‘):

['/usr/bin/pv_api'] 
['aiohttp==0.19.0', 'chardet==2.3.0', 'jsonschema==2.5.1', 'pip==7.0.0', 'pluggy==0.3.1', 'pv-api==0.0.0', 'py==1.4.31', 'pycrypto==2.6.1', 'pymongo==3.1.1', 'pyyaml==3.11', 'setuptools==19.6.2', 'six==1.10.0', 'tox==2.3.1', 'virtualenv==14.0.6', 'my-mod==0.1.0', 'webauthsession==1.1.1'] 
doing tox 
doing my_mod 
/root/my_module/my_mod/__init__.py 

Wenn der Dienst ausgeführt durch die Protokolle wie folgt aussehen (beachten Sie, dass my-mod nicht in der zweiten Zeile in ‚installierten Pakete‘ enthalten ist) ::

2016-02-26_00:39:01.90403 ['/usr/bin/pv_api'] 
2016-02-26_00:39:01.90406 ['aiohttp==0.19.0', 'chardet==2.3.0', 'jsonschema==2.5.1', 'pip==7.0.0', 'pluggy==0.3.1', 'pv-api==0.0.0', 'py==1.4.31', 'pycrypto==2.6.1', 'pymongo==3.1.1', 'pyyaml==3.11', 'setuptools==19.6.2', 'six==1.10.0', 'tox==2.3.1', 'virtualenv==14.0.6', 'webauthsession==1.1.1'] 
2016-02-26_00:39:01.90407 doing tox 
2016-02-26_00:39:01.90407 doing my_mod 
2016-02-26_00:39:01.90642 Traceback (most recent call last): 
2016-02-26_00:39:01.90642 File "/usr/bin/pv_api", line 9, in <module> 
2016-02-26_00:39:01.90642  load_entry_point('pv-api==0.0.0', 'console_scripts', 'pv_api')() 
2016-02-26_00:39:01.90643 File "/usr/lib/python3.4/site-packages/pkg_resources/__init__.py", line 547, in load_entry_point 
2016-02-26_00:39:01.90643  return get_distribution(dist).load_entry_point(group, name) 
2016-02-26_00:39:01.90643 File "/usr/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2719, in load_entry_point 
2016-02-26_00:39:01.90643  return ep.load() 
2016-02-26_00:39:01.90643 File "/usr/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2379, in load 
2016-02-26_00:39:01.90643  return self.resolve() 
2016-02-26_00:39:01.90643 File "/usr/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2385, in resolve 
2016-02-26_00:39:01.90644  module = __import__(self.module_name, fromlist=['__name__'], level=0) 
2016-02-26_00:39:01.90644 File "/usr/lib/python3.4/site-packages/pv/api/main.py", line 33, in <module> 
2016-02-26_00:39:01.90644  import my_mod 
2016-02-26_00:39:01.90644 ImportError: No module named 'my_mod' 
Diese

könnten auch nützliche Informationen sein:

[[email protected] etc]# ls -la /usr/lib/python3.4/site-packages/my-mod.egg-link 
-rw-r--r-- 1 root root 37 Feb 26 00:20 /usr/lib/python3.4/site-packages/my-mod.egg-link 
[[email protected] etc]# cat /usr/lib/python3.4/site-packages/my-mod.egg-link 
/root/my_module 

Edit:

Wie Sie aus der Ausgabe von ‚installed_packages‘ sehen können, alle anderen Pakete, die über requirements.txt installiert sind richtig 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 Kommandozeile ausgeführt werden oder wenn ich import my_mod vom python3-Interpreter ausführen.

Antwort

0

Versuchen Sie zuerst die folgenden in Python-Prompt.

$ python 
>>> import my_mod 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ImportError: No module named my_mod 
>>> 

Fix 1

Wenn Sie Wenn Sie die obige Art der Ausgabe erhalten, liegt die Ursache möglicherweise am Berechtigungsproblem. Gewähren Sie die Berechtigung für Site-Packages, indem Sie Folgendes verwenden:

Fix 2

Versuchen Sie, die PYTHONPATH wie unten exportieren:

export PYTHONPATH="/usr/.local/lib/python2.7/site-packages" 

Fix 3

Überprüfen Sie, ob Sie in derselben Maschine laufen mehrere Version von Python haben.

Wenn ja, prüfen Sie, ob Sie die richtige Dolmetscher haben am Anfang des Codes wie #!/usr/bin/python

+0

Dies kam ziemlich nah an das eigentliche Problem hervorzuheben. Das Problem bestand darin, dass der Dienst als Benutzer ausgeführt wurde, der keine Leseberechtigung für den Ordner hatte, von dem mein Modul installiert wurde. – user1753106

0

1) Installieren Sie das supervisor Paket (more verbose instructions here) enthalten ist:

sudo apt-get install supervisor 

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

[program:my_mod] 
directory=/path/to/project/root 
environment=ENV_VARIABLE=example,OTHER_ENV_VARIABLE=example2 
command=python my_mod.py 
autostart=true 
autorestart=true 

3) Restart supervisor zu l OAD Ihre neue .conf

supervisorctl update 
supervisorctl restart my_mod 
+0

Der Dienst ist bereits installiert. Das Problem ist, dass das Environment Python nicht diese eine Bibliothek enthält. Alle anderen Bibliotheken, die über die Anforderungsdatei installiert werden, werden korrekt gefunden. – user1753106

+0

Wie wäre es, diese Zeile 'sys.path.append ("/root/my_module/my_mod ")' 'vor dem Import von my_mod hinzuzufügen? – Hexoul

4

Ich hatte ein sehr ähnliches Problem Umwandlung einen Emporkömmling heartbeat.conf zu einem systemd heartbeat.service, außer mit dem requests Modul. Die Lösung wurde in der neuen .service zu spezifizieren, welche Benutzer es ausgeführt wird:

[Unit] 
Description=web server monitor 

[Service] 
WorkingDirectory=/home/user/ 
User=user 
ExecStart=/home/user/heartbeat.py 
Restart=always 

[Install] 
WantedBy=multi-user.target 

Ohne die User=user, ich war in der journalctl bekommen:

systemd[1]: Started web server monitor. 
heartbeat.py[26298]: Traceback (most recent call last): 
heartbeat.py[26298]: File "/home/user/heartbeat.py", line 2, in < 
heartbeat.py[26298]:  import requests 
heartbeat.py[26298]: ImportError: No module named requests 
systemd[1]: heartbeat.service: Main process exited, code=exited, status=1/FAILURE 
systemd[1]: heartbeat.service: Unit entered failed state. 
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.

Allerdings denke ich User=myUser in der Service-Datei wäre eine ordnungsgemäße Art, jedoch wollte ich es mit root-Berechtigungen ausführen und ich war mir nicht sicher, ob es wird, wenn ich den Benutzer angeben.

Hoffe, dass es jemand

0

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

Verwandte Themen