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.
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.
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
Si vous souhaitez exécuter le service en tant que root, vous devez installer le module avec Sudo: Sudo pip install my_module
.
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
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