2016-02-26 51 views
8

我有一個python應用程序,可以作爲系統服務運行。當我手動運行它時,應用程序運行正常。當我將它作爲服務運行時,它無法找到與pip install -e my_module一起安裝的本地模塊。作爲systemd/systemctl服務運行時,本地模塊導入失敗python

主要應用有以下代碼:

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 

當我手動運行它,我獲得(請注意,我-MOD被包括在「已安裝的軟件包」第二行):

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

當通過服務日誌看起來是這樣運行(請注意,我-MOD,但不包括在「已安裝的軟件包」第二行)::

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' 

這也可能是有用的信息:

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

編輯:

你可以從「installed_pa​​ckages」,它們通過requirements.txt安裝的所有其他包的輸出看到正確發現。當我作爲服務運行時,只有這個我有本地源代碼的庫不會被找到。 (當我在命令行中運行,或者當我從python3解釋器中運行import my_mod研究發現。

回答

0

首先嚐試在Python提示符下。

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

修復1

如果您正在獲得上述輸出,那麼原因可能是因爲許可問題。使用以下方法授予站點包的許可權:

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

修復2

嘗試導出PYTHONPATH如下:

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

修復3

檢查,如果你有在同一臺機器上運行的Python的多個版本。

如果是這樣,請檢查您是否已經正確解釋包含在代碼的開頭就像#!/usr/bin/python

+0

這非常接近強調真正的問題。問題在於該服務正在以用戶身份運行,該用戶對安裝我的模塊的文件夾沒有讀取權限。 – user1753106

0

1)安裝supervisor包(more verbose instructions here):

sudo apt-get install supervisor 

2)創建一個配置文件爲您守護在/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)重新啓動supervisor到L OAD新.conf

supervisorctl update 
supervisorctl restart my_mod 
+0

該服務已安裝。問題是環境python拾取不包含這個庫。通過需求文件安裝的所有其他庫都能正確找到。 – user1753106

+0

如何在導入my_mod之前添加這行'sys.path.append(「/ root/my_module/my_mod」)'? – Hexoul

4

我有一個非常類似的問題暴發戶heartbeat.conf轉換爲systemd heartbeat.service,除了與requests模塊。解決的辦法是在新的。服務是什麼用戶運行它作爲指定:

[Unit] 
Description=web server monitor 

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

[Install] 
WantedBy=multi-user.target 

沒有User=user,我得到的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

我有同樣的問題。我想pip install必須是用戶特定的。
所以我切換到根,然後安裝包。它在那之後工作。

但是,我認爲在服務文件中指定User=myUser將是一種更合適的方式,但是,我希望它以root權限運行,並且我不確定它會在指定用戶時運行。

希望它可以幫助別人

0

如果你想運行服務爲根,你必須使用sudo安裝模塊:sudo pip install my_module