我有一个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_packages&#39;的输出中看到的那样。通过requirements.txt安装的所有其他软件包都可以正确找到。我作为服务运行时找不到这个我本地源代码的库。 (当我从命令行运行或从python3解释器运行import my_mod
时,会发现它。
答案 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模块的问题,因此,我建议尽可能将apt
与sudo
一起使用,而不是弄乱< 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
阅读此文档: