use*_*106 17 python python-import systemd
我有一个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
Run Code Online (Sandbox Code Playgroud)
当我手动运行时,我得到(注意my-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
Run Code Online (Sandbox Code Playgroud)
在运行服务时,日志看起来像这样(注意my-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'
Run Code Online (Sandbox Code Playgroud)
这可能也是有用的信息:
[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
Run Code Online (Sandbox Code Playgroud)
编辑:
正如您从'installed_packages'的输出中看到的那样,通过requirements.txt安装的所有其他软件包都可以正确找到.我作为服务运行时找不到这个我本地源代码的库.(当我从命令行运行或import my_mod从python3解释器运行时,会发现它.
Tem*_*olf 19
我有一个非常类似的问题,将upstart heartbeat.conf转换为systemd heartbeat.service,除了requests模块.解决方案是在新的.service中指定要运行它的用户:
[Unit]
Description=web server monitor
[Service]
WorkingDirectory=/home/user/
User=user
ExecStart=/home/user/heartbeat.py
Restart=always
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
没有User=user,我进入了期刊:
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.
Run Code Online (Sandbox Code Playgroud)
小智 7
将 python site packages 环境变量添加到 systemctl *. 服务档案
[Unit]
Description=web server monitor
[Service]
WorkingDirectory=/home/user/
User=user
ExecStart=/home/user/heartbeat.py
Restart=always
Environment="PYTHONPATH=$PYTHONPATH:/home/nvidia/.local/lib/python3.6/site-packages"
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
首先在 python 提示符下尝试以下操作。
$ python
>>> import my_mod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named my_mod
>>>
Run Code Online (Sandbox Code Playgroud)
修复1
如果您得到上述类型的输出,则原因可能是由于权限问题。使用以下命令授予站点包权限。
sudo chmod -R go+rX /usr/local/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)
修复2
尝试导出 PYTHONPATH,如下所示:
export PYTHONPATH="/usr/.local/lib/python2.7/site-packages"
Run Code Online (Sandbox Code Playgroud)
修复3
检查您是否在同一台计算机上运行多个版本的 python。
如果是这样,请检查代码开头是否包含正确的解释器,例如#!/usr/bin/python
| 归档时间: |
|
| 查看次数: |
10132 次 |
| 最近记录: |