it-swarm.com.de

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

Ich habe eine Python-Anwendung, die ich als Systemdienst ausführen möchte. Die Anwendung wird ordnungsgemäß ausgeführt, wenn ich sie manuell ausführe. Wenn ich es als Dienst ausführe, kann es kein lokales Modul finden, das mit pip install -e my_module installiert wurde.

Der Hauptteil der Anwendung hat den 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 starte, erhalte ich (beachte, dass my-mod in 'installierten Paketen' in der zweiten Zeile enthalten ist):

['/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

Beim Durchlaufen des Dienstes sehen die Protokolle folgendermaßen aus (beachte, dass my-mod NICHT in der zweiten Zeile in 'installierten Paketen' 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'

Dies 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

Bearbeiten:

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

13
user1753106

Ich hatte ein sehr ähnliches Problem beim Konvertieren eines heartbeat.conf für den Start in einen systemd heartbeat.service mit Ausnahme des Moduls requests. Die Lösung bestand darin, im neuen .service anzugeben, unter welchem ​​Benutzer es ausgeführt werden soll:

[Unit]
Description=web server monitor

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

[Install]
WantedBy=multi-user.target

Ohne den User=user kam ich in das Journalctl:

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.
11
TemporalWolf

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

Sudo apt-get install supervisor

2) Erstellen Sie eine Konfigurationsdatei für Ihren Daemon unter /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) Starten Sie supervisor neu, um Ihren neuen .conf zu laden.

supervisorctl update
supervisorctl restart my_mod
1
Hexoul

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

0

Ich hatte das gleiche Problem. Ich dachte, pip install muss benutzerspezifisch sein.
Also habe ich zu root gewechselt und dann die Pakete installiert. Danach hat es funktioniert.

Ich denke jedoch, dass das Angeben von User=myUser in der Servicedatei angemessener wäre. Ich wollte jedoch, dass es mit Root-Berechtigungen ausgeführt wird, und ich war mir nicht sicher, ob dies bei der Angabe des Benutzers der Fall ist.

Hoffe es hilft jemandem

0
Dushyant Bangal

Versuchen Sie zunächst Folgendes 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 die obige Art von Ausgabe erhalten, liegt die Ursache möglicherweise in einem Berechtigungsproblem. Erteilen Sie die Berechtigung für Site-Pakete wie folgt.

Sudo chmod -R go+rX /usr/local/lib/python2.7/dist-packages

Fix 2

Versuchen Sie, den PYTHONPATH wie folgt zu exportieren:

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

Fix 3

Überprüfen Sie, ob auf demselben Computer mehrere Python-Versionen ausgeführt werden.

Wenn ja, überprüfen Sie, ob am Anfang des Codes ein geeigneter Interpreter wie #!/usr/bin/python enthalten ist.

0