web-dev-qa-db-fra.com

l'importation en python d'un module local échoue lorsqu'elle est exécutée en tant que service systemd/systemctl

J'ai une application Python que je suis tentée d'exécuter en tant que service système. L'application fonctionne correctement lorsque je l'exécute manuellement. Lorsque je l'exécute en tant que service, il ne parvient pas à trouver un module local installé avec pip install -e my_module.

Le principal de l'application a le code suivant:

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

Lorsque je l'exécute manuellement, je reçois (notez que mon mod est inclus sur la deuxième ligne des 'packages installés'):

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

Lorsqu'ils sont exécutés via le service, les journaux ressemblent à ceci (notez que my-mod n'est PAS inclus sur la deuxième ligne des 'packages installés') ::

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'

Cela pourrait aussi être une information utile:

[root@7bb8a6866a85 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
[root@7bb8a6866a85 etc]# cat /usr/lib/python3.4/site-packages/my-mod.Egg-link 
/root/my_module

Modifier:

Comme vous pouvez le constater à la sortie de 'installed_packages', tous les autres packages installés via exigences.txt sont correctement trouvés. Seule cette bibliothèque pour laquelle j'ai le code source localement est introuvable lorsque je suis exécuté en tant que service. (Il est trouvé lorsque je lance à partir de la ligne de commande ou lorsque je lance import my_mod à partir de l'interpréteur python3.

13
user1753106

J'ai eu un problème très similaire lors de la conversion d'un heartbeat.conf upstart en un systemd heartbeat.service, sauf avec le module requests. La solution consistait à spécifier dans le nouveau service .service sous quel utilisateur l'exécuter:

[Unit]
Description=web server monitor

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

[Install]
WantedBy=multi-user.target

Sans le User=user, je devenais dans le 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) Installez le paquetage supervisor ( instructions plus détaillées ici ):

Sudo apt-get install supervisor

2) Créez un fichier de configuration pour votre démon à /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) Redémarrez supervisor pour charger votre nouveau .conf

supervisorctl update
supervisorctl restart my_mod
1
Hexoul

Si vous souhaitez exécuter le service en tant que root, vous devez installer le module avec Sudo: Sudo pip install my_module.

0
Sjaak van de Hoek

J'ai eu le même problème. J'ai pensé que pip install devait être spécifique à l'utilisateur.
Je suis donc passé à root, puis j'ai installé les paquetages. Cela a fonctionné après cela.

Cependant, je pense que spécifier User=myUser dans le fichier de service serait une méthode plus appropriée. Cependant, je voulais qu'il s'exécute avec des autorisations root et je n'étais pas sûr que ce sera le cas lorsque je spécifierai l'utilisateur.

J'espère que ça aide quelqu'un

0
Dushyant Bangal

Commencez par essayer ce qui suit dans l’invite python.

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

Fix 1

Si vous obtenez le type de sortie ci-dessus, cela peut être dû à un problème d'autorisation. Accordez l'autorisation pour les packages de site en utilisant les éléments suivants.

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

Fix 2

Essayez d’exporter le PYTHONPATH comme ci-dessous:

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

Fix 3

Vérifiez si plusieurs versions de python sont exécutées sur le même ordinateur.

Si c'est le cas, vérifiez si vous avez un interprète approprié au début du code, tel que #!/usr/bin/python

0
Nagaraja Thangavelu