在“systemd”服务脚本中找不到Python模块

2024-10-03 11:16:32 发布

您现在位置:Python中文网/ 问答频道 /正文

有了几十个以前的答案,我很惊讶我什么都找不到。。。你知道吗

我将pahomqtt库用于一个非常简单的python程序来报告一些数据(在Raspberry Pi上运行)。从python程序中导入_程序.py)是:

import paho.mqtt.client as mqtt

如果我使用python my_program.py从命令行运行程序,它运行时不会出错。但是,我正在尝试将其设置为系统服务来管理其执行。我用类似的python程序做了十几次,设置了各种bash脚本和服务文件。他们都工作除了这个。我提到这一点是因为我不认为它与bash或服务本身有关。为了完整起见,这里是设置。你知道吗

从运行-

## Service (my_program.service):
ExecStart=/home/pi/my_program.sh

## and bash (my_program.sh)
python /home/pi/my/directory/my_program.py

当我开始服务时,我得到:

pi@ArmstrongSE:/etc/systemd/system $ sudo systemctl status my_program
* my_program.service
   Loaded: loaded (/etc/systemd/system/my_program.service; static; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2019-11-23 13:59:58 PST; 22s ago
  Process: 31100 ExecStart=/home/pi/my_program.sh (code=exited, status=1/FAILURE)
 Main PID: 31100 (code=exited, status=1/FAILURE)

Nov 23 13:59:54 ArmstrongSE systemd[1]: Started my_program.service.
Nov 23 13:59:54 ArmstrongSE my_program.sh[31100]: Starting MQTT Transmitter
Nov 23 13:59:55 ArmstrongSE my_program.sh[31100]: /home/pi/data/solar/20191123135605.json
Nov 23 13:59:58 ArmstrongSE my_program.sh[31100]: Traceback (most recent call last):
Nov 23 13:59:58 ArmstrongSE my_program.sh[31100]:   File "/home/pi/my/directory/my_program.py", line 25, in <module>
Nov 23 13:59:58 ArmstrongSE my_program.sh[31100]:     import paho.mqtt.client as mqtt
Nov 23 13:59:58 ArmstrongSE my_program.sh[31100]: ImportError: No module named paho.mqtt.client

要确认路径分配是否存在--

从python解释器中我得到:

>>> import paho.mqtt.client as mqtt
>>> print(mqtt.__file__)
/home/pi/.local/lib/python2.7/site-packages/paho/mqtt/client.pyc

sys.path报告:

>>> import sys
>>> print(sys.path)
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-arm-linux-gnueabihf', 
'/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', 
'/home/pi/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/gtk-2.0']

我被困住了。。。你有没有想过为什么这个不能加载?你知道吗

更新/澄清:

我可以从任何地方(任何目录)运行bash脚本,它可以正常工作。所以,它一定是systemd设置(?)中的某个东西。你知道吗


Tags: py程序clienthomemylibpackagesusr
3条回答

尝试用root安装模块。你知道吗

我想我找到问题所在了。。。systemd默认情况下作为root运行其服务。我认为(见下文),这将/应该允许为另一个用户或cli上的实际用户使用sudo来运行类似于root的东西。你知道吗

只关注systemd的服务文件,我在man pages中发现有一个[Service]参数,允许您指定谁运行服务。在本例中,我尝试将参数设置为:

[Service]
User=pi
ExecStart=/home/pi/my_program.sh

这允许服务在没有错误(上面提到的错误)的情况下运行。你知道吗

我也可以使用这些设置,执行时不会出错:

[Service]
User=root
ExecStart=/home/pi/my_program.sh

原因:

对于在这里找到自己的其他人,如果从[Service]部分省略User=参数,则默认值为root。但是,这与将User=参数设置为root(例如,User=root)或另一个用户(在我的例子中是pi)不同。你知道吗

我不太明白其中的细微差别,但是从environmental variables的文档来看,User=参数用于设置$PATH变量。如果服务文件没有User=集,我认为这会导致路径分配出现问题。我认为这就是为什么将User=设置为pi或root可以解决这个问题,而使用默认值似乎会导致这个问题。你知道吗

欢迎讲解和教育。谢谢。你知道吗

这可能是python存在的一个链接问题。如果要通过pip安装库,它可能链接或安装不正确。我建议使用以下方法重新安装mqtt库。。。你知道吗

sudo -H pip3 install  system paho-mqtt

另外,我注意到你的导入是错误的。你写了:import pho.mqtt.client as mqtt。你知道吗

应该是:

import paho.mqtt.client as mqtt

相关问题 更多 >