2016-02-26 27 views
8

Mam aplikację python, którą próbuję uruchomić jako usługę systemową. Aplikacja działa poprawnie, gdy uruchomię ją ręcznie. Gdy uruchomię go jako usługę, nie uda się znaleźć modułu lokalnego, który został zainstalowany pod numerem pip install -e my_module.Python import modułu lokalnego zawiesza się po uruchomieniu jako usługa systemd/systemctl

Głównym aplikacji jest następujący kod:

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 

Kiedy uruchomić go ręcznie dostaję (zauważ, że moi-mod to na drugiej linii „zainstalowanych pakietów”):

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

Kiedy prowadzony przez służby dzienniki wyglądać następująco (zauważ, że my-mod nie figuruje na drugiej linii „zainstalowanych pakietów”) ::

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' 

Może to być również przydatne informacje:

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

Jak widać z wyjścia „installed_packages” wszystkich pozostałych pakietów, które są zainstalowane prawidłowo poprzez requirements.txt znaleziono . Ta jedna biblioteka, dla której mam kod źródłowy lokalnie, nie zostanie znaleziona, gdy uruchomię się jako usługa. (Okaże się, kiedy uruchamiane z linii poleceń lub gdy biegnę import my_mod od tłumacza python3.

Odpowiedz

0

Najpierw spróbuj wykonać następujące czynności w wierszu Pythona.

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

Fix 1

Jeśli uzyskują powyższy rodzaj danych wyjściowych, a przyczyną może być problem z uprawnieniami. Zaakceptuj uprawnienie dla pakietów witryn za pomocą następujących elementów:

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

Fix 2

Spróbuj eksportowania PYTHONPATH jak poniżej:

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

Fix 3

Sprawdź, czy masz wiele wersji Pythona uruchomiony w tym samym komputerze.

Jeśli tak, sprawdź, czy masz odpowiednie interpreter jest zawarty na początku kodu podobnego #!/usr/bin/python

+0

To było dość bliskie podkreślenia prawdziwego problemu. Problem polegał na tym, że usługa była uruchamiana jako użytkownik, który nie miał uprawnień do odczytu w folderze, z którego został zainstalowany mój moduł. – user1753106

0

1) Zainstaluj pakiet supervisor (more verbose instructions here):

sudo apt-get install supervisor 

2) Utwórz plik konfiguracyjny dla demona w /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) Restart supervisor L OAD swój nowy .conf

supervisorctl update 
supervisorctl restart my_mod 
+0

Usługa jest już zainstalowana. Problem polega na tym, że python środowiskowy nie zawiera tej jednej biblioteki. Wszystkie inne biblioteki instalowane za pośrednictwem pliku wymagań są poprawnie znalezione. – user1753106

+0

Co powiesz na dodanie tej linii 'sys.path.append ("/root/my_module/my_mod ")' przed zaimportowaniem my_mod? – Hexoul

4

miałem bardzo podobny problem przekształcania dorobkiewicz heartbeat.conf do Systemd heartbeat.service, z wyjątkiem modułu requests. Rozwiązaniem było określić w nowej .service co użytkownikowi uruchamiać go jako:

[Unit] 
Description=web server monitor 

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

[Install] 
WantedBy=multi-user.target 

Bez User=user, ja trafiałem w 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

miałem ten sam problem. Pomyślałem, że pip install musi być specyficzny dla użytkownika.
Więc przełączyłem się na root, a następnie zainstalowałem pakiety. Działało to później.

Jednak myślę, że określanie User=myUser w pliku usługi byłoby bardziej odpowiednie, jednak chciałem, aby działał z uprawnieniami root'a i nie byłem pewien, że to będzie, gdy określę użytkownika.

Mam nadzieję, że ktoś pomoże

0

Jeśli chcemy uruchomić usługę jako root, trzeba zainstalować moduł z sudo: sudo pip install my_module.