Pregunta importación python del módulo local que falla cuando se ejecuta como servicio systemd / systemctl


Tengo una aplicación de Python que estoy intentando ejecutar como un servicio del sistema. La aplicación funciona bien cuando la ejecuto manualmente. Cuando lo ejecuto como un servicio, no puedo encontrar un módulo local que se instaló con pip install -e my_module.

El principal de la aplicación tiene el siguiente código:

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

Cuando lo ejecuto manualmente obtengo (tenga en cuenta que my-mod se incluye en la segunda línea en 'paquetes instalados'):

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

Cuando se ejecuta a través del servicio, los registros se ven así (tenga en cuenta que my-mod NO se incluye en la segunda línea en 'paquetes instalados') ::

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'

Esta también podría ser información útil:

[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

Editar:

Como puede ver en la salida de 'installed_packages', todos los demás paquetes que se instalan a través de requirements.txt se encuentran correctamente. Solo esta biblioteca que tengo código fuente localmente no se encuentra cuando corro como servicio. (Se encuentra cuando corro desde la línea de comando o cuando corro import my_mod del intérprete de python3.


9
2018-02-26 00:56


origen


Respuestas:


Tuve un problema muy similar al convertir un advenedizo heartbeat.conf a un sistemad heartbeat.service, excepto con el requests módulo. La solución fue especificar en el nuevo servicio el usuario para ejecutarlo como:

[Unit]
Description=web server monitor

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

[Install]
WantedBy=multi-user.target

Sin el User=user, Estaba entrando al 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.

8
2017-10-11 22:21



Primero intente lo siguiente en el prompt de 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 obtiene el tipo de resultado anterior, la causa puede deberse a un problema de permiso. Otorgue permiso para paquetes de sitio usando lo siguiente.

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

Fix 2

Intente exportar el PYTHONPATH de la siguiente manera:

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

Fix 3

Compruebe si tiene múltiples versiones de python ejecutándose en la misma máquina.

Si es así, compruebe si se incluye un intérprete adecuado al comienzo del código, como #!/usr/bin/python


0
2018-02-26 01:46



1) Instale el supervisor paquete (instrucciones más detalladas aquí)

sudo apt-get install supervisor

2) Crea un archivo de configuración para tu daemon en /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) Reiniciar supervisor cargar tu nuevo .conf

supervisorctl update
supervisorctl restart my_mod

0
2018-02-26 02:04



Yo tuve el mismo problema. Lo supuse pip install debe ser específico del usuario.
Así que cambié a root y luego instalé los paquetes. Funcionó después de eso.

Sin embargo, creo que especificar User=myUser en el archivo de servicio sería una manera más adecuada, sin embargo, quería que se ejecutara con permisos de raíz y no estaba seguro de que lo haga cuando especifique el usuario.

Espero que ayude a alguien


0
2018-04-27 09:32



Si desea ejecutar el servicio como root, debe instalar el módulo con sudo: sudo pip install my_module.


0
2018-02-03 20:50