以systemd / systemctl服务

时间:2016-02-26 00:56:09

标签: 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

当我手动运行时,我会得到(请注意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

当运行服务时,日志看起来像这样(注意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'

这也可能是有用的信息:

[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

编辑:

正如您从&#39; installed_pa​​ckages&#39;的输出中看到的那样。通过requirements.txt安装的所有其他软件包都可以正确找到。我作为服务运行时找不到这个我本地源代码的库。 (当我从命令行运行或从python3解释器运行import my_mod时,会发现它。

8 个答案:

答案 0 :(得分:11)

我有一个非常类似的问题,即将新贵 1) Tools::GenericController GET show does stuff Failure/Error: get :show ActionController::RoutingError: No route matches {:controller=>"tools/generic", :action=>"show"} 转换为系统heartbeat.conf,但heartbeat.service模块除外。解决方案是在新的.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

答案 1 :(得分:1)

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以加载新的.conf

supervisorctl update
supervisorctl restart my_mod

答案 2 :(得分: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

答案 3 :(得分:0)

我遇到了同样的问题。我认为pip install必须是用户特定的 所以我切换到root然后安装了包。之后它起作用了。

但是,我认为在服务文件中指定User=myUser将是一种更合适的方式,但是,我希望它以root权限运行,而且当我指定用户时我不确定它是否会运行。

希望它有助于某人

答案 4 :(得分:0)

如果您确实希望以root身份运行该服务,则必须使用sudo sudo pip install my_module安装该模块。

答案 5 :(得分:0)

由于您的python脚本正在使用python3.4执行,因此您的问题很可能是使用pip而不是pip3(或者可能是sudo -H pip3)。

但是,由于您还专门询问有关从 systemd 服务使用python模块的问题,因此,我建议尽可能将aptsudo一起使用,而不是弄乱< em> pip (因引入文件权限问题而臭名昭著):

sudo apt install python3-my_module

答案 6 :(得分:0)

将python网站包环境变量添加到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

答案 7 :(得分:0)

我也遇到了导入错误,但我的不是本地导入。我的包没有正确导入。查看服务故障日志*

Feb 11 06:41:52 pl-dev-demo-1 python3[1675804]:     from foo import test
Feb 11 06:41:52 pl-dev-demo-1 python3[1675804]: ModuleNotFoundError: No module named 'foo'
Feb 11 06:41:52 pl-dev-demo-1 systemd[1]: xyzxyz.service: Main process exited, code=exited, status=1/FAILURE

我浪费了很多时间来弄清楚然后我尝试了这种完美的方法。

在模块中我设置了代码的路径:

import sys
sys.path.append('path_of_my_code_parent_package')

from foo import test 

阅读此文档:

Setting PYTHONPATH more permanently