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.
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