Python 从 `systemd` 服务脚本中找不到模块
Python Module not Found from `systemd` service Script
前面几十个答案,我很惊讶我找不到任何东西...
我正在使用 paho
mqtt 库作为一个非常简单的 python 程序来报告一些数据(运行ning on a Raspberry Pi)。我从 python 程序 (my_program.py) 中导入的是:
import paho.mqtt.client as mqtt
如果我 运行 从命令行使用 python my_program.py
程序,它 运行 没有错误。但是,我试图将它设置为系统服务来管理它的执行。我已经用类似的 python 程序完成了十几次,设置了各种 bash 脚本和服务文件。他们都工作,除了这个。我提到这一点是因为我认为它与 bash 或服务本身无关。为了完整起见,这里是设置。
从 bash script/systemd 那 运行s -
## 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']
我被卡住了...想知道为什么这不会加载吗?
Update/Clarification:
我可以从任何地方(任何目录)运行 bash 脚本并且它有效。所以,它一定是 systemd
设置中的东西 (?).
尝试使用root安装模块。
这可能是 python 遇到的 linking 问题。如果您要通过 pip 安装一个库,它可能会或可能不会 link 或正确安装。我会建议重新安装 mqtt 库使用类似...
sudo -H pip3 install --system paho-mqtt
此外,我注意到您的导入有误。您写道:import pho.mqtt.client as mqtt
.
应该是:
import paho.mqtt.client as mqtt
我想我知道问题出在哪里了...systemd
运行 它的服务默认为 root
。 would/should,我认为(见下文)允许 运行ning 等价于 root
对另一个用户或 cli 上的实际 root
用户使用 sudo .
只关注 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 可以解决这个问题,而使用默认值似乎会导致问题。
欢迎讲解和教育。谢谢。
前面几十个答案,我很惊讶我找不到任何东西...
我正在使用 paho
mqtt 库作为一个非常简单的 python 程序来报告一些数据(运行ning on a Raspberry Pi)。我从 python 程序 (my_program.py) 中导入的是:
import paho.mqtt.client as mqtt
如果我 运行 从命令行使用 python my_program.py
程序,它 运行 没有错误。但是,我试图将它设置为系统服务来管理它的执行。我已经用类似的 python 程序完成了十几次,设置了各种 bash 脚本和服务文件。他们都工作,除了这个。我提到这一点是因为我认为它与 bash 或服务本身无关。为了完整起见,这里是设置。
从 bash script/systemd 那 运行s -
## 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']
我被卡住了...想知道为什么这不会加载吗?
Update/Clarification:
我可以从任何地方(任何目录)运行 bash 脚本并且它有效。所以,它一定是 systemd
设置中的东西 (?).
尝试使用root安装模块。
这可能是 python 遇到的 linking 问题。如果您要通过 pip 安装一个库,它可能会或可能不会 link 或正确安装。我会建议重新安装 mqtt 库使用类似...
sudo -H pip3 install --system paho-mqtt
此外,我注意到您的导入有误。您写道:import pho.mqtt.client as mqtt
.
应该是:
import paho.mqtt.client as mqtt
我想我知道问题出在哪里了...systemd
运行 它的服务默认为 root
。 would/should,我认为(见下文)允许 运行ning 等价于 root
对另一个用户或 cli 上的实际 root
用户使用 sudo .
只关注 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 可以解决这个问题,而使用默认值似乎会导致问题。
欢迎讲解和教育。谢谢。