2016-02-26 10 views
8

Ho un'applicazione python che sto cercando di eseguire come servizio di sistema. L'applicazione funziona correttamente quando la eseguo manualmente. Quando lo eseguo come servizio non riesce a trovare un modulo locale che è stato installato con pip install -e my_module.importazione python del modulo locale non riuscita quando eseguito come servizio systemd/systemctl

La principale dell'applicazione è il seguente codice:

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 

Quando eseguo manualmente io ottenere (si noti che i miei-Mod è includono in seconda linea in 'pacchetti installati'):

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

Quando viene eseguito attraverso il servizio i log simile a questa (si noti che il mio-mod non è incluso in seconda linea in 'pacchetti installati') ::

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' 

Questo potrebbe anche essere informazioni utili:

[[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:

Come si può vedere dalla uscita di 'installed_packages' tutti gli altri pacchetti che vengono installati tramite requirements.txt si trovano correttamente . Solo questa libreria che ho il codice sorgente per localmente non viene trovata quando corro come servizio. (Si trova quando ho eseguito dalla riga di comando o quando corro import my_mod dall'interprete python3.

risposta

0

prima prova quanto segue in prompt di pitone.

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

Fix 1

Se stanno ottenendo il tipo di output di cui sopra, la causa potrebbe essere a causa del problema dell'autorizzazione. Concedi l'autorizzazione per i pacchetti del sito utilizzando quanto segue:

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

Fix 2

Prova esportare il PYTHONPATH come di seguito:

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

Fix 3

Verificare se si dispone di più versioni di pitone in esecuzione nella stessa macchina.

Se è così, controllare se è stato corretto interprete è incluso all'inizio del codice come #!/usr/bin/python

+0

Questo è venuto abbastanza vicino a evidenziare il vero problema. Il problema era che il servizio veniva eseguito come utente che non aveva i permessi di lettura sulla cartella da cui era stato installato il mio modulo. – user1753106

0

1) Installare il pacchetto supervisor (more verbose instructions here):

sudo apt-get install supervisor 

2) Creare un file di configurazione per il demone a /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) Riavviare supervisor per l oad vostro nuovo .conf

supervisorctl update 
supervisorctl restart my_mod 
+0

Il servizio è già installato. Il problema è che la raccolta di python dell'ambiente non contiene questa libreria. Tutte le altre librerie che vengono installate tramite il file dei requisiti vengono trovate correttamente. – user1753106

+0

Come aggiungere questa riga 'sys.path.append ("/root/my_module/my_mod ")' prima di importare my_mod? – Hexoul

4

Ho avuto un problema molto simile conversione di un parvenu heartbeat.conf ad uno systemd heartbeat.service, se non con il modulo requests. La soluzione era quella di indicare nel nuovo .service cosa all'utente di eseguire come:

[Unit] 
Description=web server monitor 

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

[Install] 
WantedBy=multi-user.target 

Senza la User=user, mi è stato sempre nel 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. 
0

Ho avuto lo stesso problema. Ho pensato che pip install deve essere specifico dell'utente.
Quindi sono passato a root e quindi ho installato i pacchetti. Ha funzionato dopo.

Tuttavia, penso che specificare User=myUser nel file di servizio sarebbe un modo più corretto, tuttavia, volevo che fosse eseguito con i permessi di root e non ero sicuro che lo sarebbe quando specificherò l'utente.

Speranza che aiuta qualcuno

0

Se si vuole eseguire il servizio come utente root, è necessario installare il modulo con sudo: sudo pip install my_module.

Problemi correlati