Pythonスクリプトをシステムタスクとして実行すると、ModuleNotFoundErrorが発生しました。

Pythonスクリプトをシステムタスクとして実行すると、ModuleNotFoundErrorが発生しました。

起動時に実行したいPythonスクリプトがあります。ただし、システムサービスとして実行すると、モジュールの1つが見つからないようです。ステータスメッセージは次のとおりです。

● mqttproc.service - MQTT Post-processor
     Loaded: loaded (/etc/systemd/system/mqttproc.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2021-12-06 11:10:45 GMT; 2min 31s ago
    Process: 2375 ExecStart=/usr/bin/python3 /home/ken/python/mqttproc/mqttproc.py (code=exited, status=1/FAILURE)
   Main PID: 2375 (code=exited, status=1/FAILURE)

Dec 06 11:10:45 MintVM systemd[1]: Started MQTT Post-processor.
Dec 06 11:10:45 MintVM python3[2375]: Sensor positions [100.0, 80.0, 60.0, 40.0, 20.0, 0.0] (Litres)
Dec 06 11:10:45 MintVM python3[2375]: Traceback (most recent call last):
Dec 06 11:10:45 MintVM python3[2375]:   File "/home/ken/python/mqttproc/mqttproc.py", line 131, in <module>
Dec 06 11:10:45 MintVM python3[2375]:     import paho.mqtt.client as mqtt
Dec 06 11:10:45 MintVM python3[2375]: ModuleNotFoundError: No module named 'paho'
Dec 06 11:10:45 MintVM systemd[1]: mqttproc.service: Main process exited, code=exited, status=1/FAILURE
Dec 06 11:10:45 MintVM systemd[1]: mqttproc.service: Failed with result 'exit-code'.

奇妙なことは、このスクリプトをコマンドラインで実行しても失敗しないことです。他のコンピュータでシステムサービスとして実行した。私の.serviceファイルはとても簡単です。

[Unit]
Description=MQTT Post-processor

[Service]
ExecStart=/usr/bin/python3 /home/ken/python/mqttproc/mqttproc.py
WorkingDirectory=/home/ken/python/mqttproc

[Install]
WantedBy=multi-user.target

誰もが私が逃した明白な点を指摘できますか?

よろしくお願いします。

答え1

ジョブがによって実行されているcronか、systemd起動スクリプトがデスクトップで実行されているのと同じランタイム環境で実行されていません。systemdでスクリプトを起動しますroot。変更やその他の環境変数の設定は、ジョブに自動的に伝播されPATHません。たとえば、noなので、GUIプログラムには特別な処理(読み取り)が必要です。~/.bashrccron$DISPLAYman xhost

cron環境変数は、すべてのジョブの読み取りファイルで設定できます。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias各環境の結果を確認してください。

関連情報