AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1540157
Accepted
gatorback
gatorback
Asked: 2025-02-01 02:56:53 +0800 CST2025-02-01 02:56:53 +0800 CST 2025-02-01 02:56:53 +0800 CST

python 脚本无法在服务中启动

  • 772

语境

  • Ubuntu 22.04 桌面:MQTT 服务器

  • 目标:将 python(paho with logger)脚本作为服务运行

  • .py 按预期记录常规测试(不在 venv 中):

python3 mqtt2log.py

脚本的第 6 行是:import paho.mqtt.client as mqtt

.service 文件被复制到 /etc/system/system:

# run python script as service
# https://unix.stackexchange.com/a/634422/182280e
# copy this .service description to /etc/systemd/system/myscript.service
# /home/user/mqtt2log.py

[Unit]
Description=mqtt2log.py

[Service]
ExecStart=/usr/bin/python3 /home/user/mqtt/mqtt2log.py

[Install]
WantedBy=multi-user.target

观察

ls -l /etc/systemd/system/mqtt2log.service返回:

-rwxrwxrwx 1 root root 314 Jan 11 17:41 /etc/systemd/system/mqtt2log.service

sudo systemctl status mqtt2log返回:

Jan 31 13:01:30 mqtt systemd[1]: Started mqtt2log.py.
Jan 31 13:01:30 mqtt python3[158388]: Traceback (most recent call last):
Jan 31 13:01:30 mqtt python3[158388]:   File "/home/user/mqtt/mqtt2log.py", line 6, in <module>
Jan 31 13:01:30 mqtt python3[158388]:     import paho.mqtt.client as mqtt
Jan 31 13:01:30 mqtt python3[158388]: ModuleNotFoundError: No module named 'paho'
Jan 31 13:01:30 mqtt systemd[1]: mqtt2log.service: Main process exited, code=exited, status=1/FAILURE
Jan 31 13:01:30 mqtt systemd[1]: mqtt2log.service: Failed with result 'exit-code'.

错误消息似乎表明在第 6 行找不到 paho 模块:import paho.mqtt.client as mqtt

问题

返回错误:ModuleNotFoundError: No module named 'paho'

  1. 为什么找不到 paho 模块?

  2. 可以采取哪些诊断步骤?

我对 python 脚本从命令行运行的事实感到困惑。 也许这是权限问题?

MQTT / Paho 安装

sudo apt update
sudo apt-get install mosquitto
sudo vi /etc/mosquitto/mosquitto.conf 
    allow_anonymous true
    listener 1883
sudo systemctl restart mosquitto
sudo apt install python3-pip
pip3 install paho-mqtt
sudo apt install -y mosquitto-clients
22.04
  • 2 2 个回答
  • 103 Views

2 个回答

  • Voted
  1. Best Answer
    Thomas Ward
    2025-02-01T11:37:49+08:002025-02-01T11:37:49+08:00

    问题是pip。您的依赖项 - paho-mqtt- 在通过 安装时pip只会安装在您的用户空间或安装到 中,venv因为它无法写入系统。

    但是,由于PEP 668(目前似乎仅在 Ubuntu 24.04 及更高版本的 Python 3.12 上启用),pip将无法安装到外部管理环境中(即 Ubuntu 系统上的系统 Python)。您可能会遇到这种情况,在这种情况下,您应该创建一个专用的venv,然后使用 Python 可执行文件的完整路径调用 Python 脚本,以便它知道要使用venv哪个(在运行时设置它)PYTHON_ROOTvenv

    我的建议是为venv您的应用程序制作一个专用的,然后您的系统直接使用可执行文件的完整路径调用 Python 可执行文件和文件venv。

    例如,如果您的服务的工作目录是,/opt/myservice/您可以执行以下操作:

    python3 -m venv /opt/myservice/venv
    source /opt/myservice/venv/bin/activate
    pip3 install paho-mqtt
    

    ...然后在您的服务执行行(假设是 SystemD)中,您将拥有:

    ...
    
    [Service]
    ...
    WorkingDirectory=/opt/myservice
    ExecStart=/opt/myservice/venv/bin/python /opt/myservice/script.py
    ...
    

    从而直接从 venv 的 Python 调用服务的脚本等。

    确保所有文件、venv等的所有权都属于您的服务运行的用户和组!


    如果您绝对想忽略 PEP 668,并引入保护措施有意试图保护您免受的潜在系统/模块冲突,请认识到,按照以下说明操作,您将面临损坏系统包等的风险。这样做意味着您接受所有风险!

    在 Ubuntu 中 Python 3.12 之前的版本中,您可以运行以下命令在系统级别安装您选择的模块:

    sudo pip3 install paho-mqtt
    

    在 Python 3.12 及更高版本中,你必须执行以下操作:

    sudo pip3 install --break-system-packages
    

    请注意,这样做将导致您破坏系统 Python 或与系统已安装的软件包发生冲突的所有风险。

    • 1
  2. waltinator
    2025-02-01T03:49:29+08:002025-02-01T03:49:29+08:00

    通过 运行的作业cron(或启动脚本或systemd脚本)不会在桌面上的同一运行时环境中运行。启动脚本以 的形式运行root。您的任何PATH更改或其他环境变量设置~/.bashrc都不会自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(阅读man xhost)。

    cron人们可以在crontab文件 Read中为所有工作设置环境变量man 5 crontab。

    echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。
    一种简单的方法是将命令存储在bash脚本中,并从终端会话中执行该脚本,保存输出,然后从“其他”环境执行该脚本,保存输出。使用比较保存的输出diff。

    #!/bin/bash
    echo "=== id ===";id
    echo "=== set ===";set
    echo "=== env ===";env | sort
    echo "=== alias ===";alias`
    

    由于command该行的一部分crontab默认由 解释/bin/sh,其语法比 更简单/bin/bash,因此我建议调用command一个bash脚本(可执行、已安装、以 开头#!/bin/bash)来设置环境,然后调用所需的程序。

    • -1

相关问题

  • Ubuntu 22.04 Beta 中的慢速互联网连接 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve