问题描述
我有一个 python 应用程序,我想将它作为系统服务运行.当我手动运行该应用程序时,它运行良好.当我将它作为服务运行时,它无法找到使用 pip install -e my_module
安装的本地模块.
I have a python application that I'm tring to run as a system service. The application runs fine when I run it manually. When I run it as a service it fails to find a local module that was installed with pip install -e my_module
.
应用程序主体部分代码如下:
The main of the application has the following code:
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 包含在已安装包"的第二行):
When I run it manually I get (note that my-mod is include on second line in 'installed packages'):
['/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)::
When run through the service the logs look like this (note that my-mod is NOT included on second line in 'installed packages')::
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'
这也可能是有用的信息:
This might also be useful information:
[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 安装的所有其他软件包都被正确找到.当我作为服务运行时,找不到我在本地拥有源代码的这个库.(当我从命令行运行或当我从 python3 解释器运行 import my_mod
时发现它.
As you can see from the output of 'installed_packages' all other packages that are installed via requirements.txt are found correctly. Just this one library that I have source code for locally is not found when I run as service. (It is found when I run from the command line or when I run import my_mod
from the python3 interpreter.
推荐答案
我遇到了一个非常相似的问题,将新贵 heartbeat.conf
转换为 systemd heartbeat.service
,除了 requests
模块.解决方案是在新的 .service 中指定运行它的用户:
I had a very similar issue converting an upstart heartbeat.conf
to a systemd heartbeat.service
, except with the requests
module. The solution was to specify in the new .service what user to run it as:
[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:
Without the User=user
, I was getting in the 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.
这篇关于作为 systemd/systemctl 服务运行时,python 导入本地模块失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!