Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为systemd/systemctl服务运行时本地模块的python导入失败_Python_Python Import_Systemd - Fatal编程技术网

作为systemd/systemctl服务运行时本地模块的python导入失败

作为systemd/systemctl服务运行时本地模块的python导入失败,python,python-import,systemd,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

我有一个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
当我手动运行它时,我得到(注意,我的mod包含在“已安装软件包”的第二行):

当运行该服务时,日志如下所示(请注意,“已安装的软件包”的第二行中不包括my mod):

编辑:


从“installed_packages”的输出中可以看到,通过requirements.txt安装的所有其他软件包都被正确找到。当我作为服务运行时,我在本地没有找到这个库的源代码。(当我从命令行运行时,或者当我从python3解释器运行import my_mod时,会发现它。

首先在python提示符中尝试以下操作

$ python
>>> import my_mod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named my_mod
>>>
修复2

尝试导出PYTHONPATH,如下所示:

export PYTHONPATH="/usr/.local/lib/python2.7/site-packages"
修复3

检查是否有多个版本的python在同一台机器上运行

如果是这样,请检查代码开头是否包含正确的解释器,如
#!/usr/bin/python
1)安装
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

我在将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
,我就进入了日志TL:

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[1]:已启动web服务器监视器。
heartbeat.py[26298]:回溯(最近一次调用):
heartbeat.py[26298]:文件“/home/user/heartbeat.py”,第2行,在<
heartbeat.py[26298]:导入请求
heartbeat.py[26298]:ImportError:没有名为请求的模块
systemd[1]:heartbeat.service:主进程退出,代码=退出,状态=1/失败
systemd[1]:heartbeat.service:单元进入失败状态。

我也有同样的问题。我认为
pip安装必须是特定于用户的。
所以我切换到root,然后安装了这些包。在那之后,它起了作用

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


希望它能帮助别人

如果你想以root用户身份运行服务,你必须用sudo安装模块:
sudo pip install my_module
因为你的python脚本是用
python3.4
执行的,你的问题很可能是使用
pip
而不是
pip3
(或者可能
sudo-H pip3

但是,由于您还特别询问如何使用systemd服务中的python模块,因此我建议尽可能将
apt
sudo
结合使用,而不是与pip(pip因引入文件权限问题而臭名昭著):


将python site packages环境变量添加到systemctl*.Service文件中

[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


我也收到导入错误,但我的不是本地导入。我的包没有正确导入。请参阅服务失败日志*

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 
阅读本文件:


该服务已安装。问题是python拾取的环境不包含此库。通过需求文件安装的所有其他库都已正确找到。添加此行如何
sys.path.append(“/root/my\u module/my\u mod”)
在导入我的\u mod之前?这很接近于突出显示真正的问题。问题是该服务是以一个用户的身份运行的,该用户对安装我的模块的文件夹没有读取权限。请注意,它是
user=
。值取决于用户名!
[Unit]
Description=web server monitor

[Service]
WorkingDirectory=/home/user/
User=user
ExecStart=/home/user/heartbeat.py
Restart=always

[Install]
WantedBy=multi-user.target
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.
sudo apt install python3-my_module
[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

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