pythonアプリケーションをシステムサービスとして実行しようとしています。手動で実行すると、アプリケーションは正常に実行されます。サービスとして実行すると、ローカルモジュールが見つかりませんpip install -e my_module
でインストールされました。
アプリケーションのメインには、次のコードがあります。
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
手動で実行すると、次のようになります(my-modが「インストール済みパッケージ」の2行目に含まれていることに注意してください)。
['/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
サービスを実行すると、ログは次のようになります(my-modは「インストール済みパッケージ」の2行目に含まれていないことに注意してください):
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'
これも役に立つ情報かもしれません:
[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
編集:
「installed_packages」の出力からわかるように、requirements.txtによってインストールされた他のすべてのパッケージが正しく検出されます。ローカルでソースコードを持っているこの1つのライブラリだけが、サービスとして実行したときに見つかりません。 (コマンドラインから実行したとき、またはpython3インタープリターからimport my_mod
を実行したときに見つかります。
requests
モジュールを除いて、upstart heartbeat.conf
をsystemd heartbeat.service
に変換する非常に類似した問題がありました。解決策は、実行するユーザーを新しい.serviceで指定することでした。
[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.
pythonスクリプトがpython3.4
で実行されているため、問題はpip3
(またはおそらくSudo -H pip3
)ではなくpip
を使用している可能性があります。
ただし、pythonモジュールのsystemdサービスからのモジュールの使用についても具体的に質問するため、apt
とSudo
を併用することをお勧めしますpipをいじる代わりに、可能な限り(ファイルのアクセス権に問題が生じることで悪名高い):
Sudo apt install python3-my_module
1)supervisor
パッケージをインストールします( 詳細な説明はこちら ):
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
を再起動して、新しい.conf
をロードします
supervisorctl update
supervisorctl restart my_mod
Rootとしてサービスを実行したい場合は、Sudoを使用してモジュールをインストールする必要があります:Sudo pip install my_module
。
私も同じ問題を抱えていました。私は理解した pip install
はユーザー固有である必要があります。
そこでルートに切り替えて、パッケージをインストールしました。それはその後働きました。
ただし、User=myUser
サービスファイル内のほうが適切な方法ですが、ルート権限で実行する必要があり、ユーザーを指定するときにそうなるかどうか確信がありませんでした。
それが誰かを助けることを願って
最初に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"
修正
同じマシンで複数のバージョンのpythonが実行されているかどうかを確認してください。
その場合、#!/usr/bin/python
のようなコードの先頭に適切なインタープリターが含まれているかどうかを確認してください。