代码之家  ›  专栏  ›  技术社区  ›  on_the_way_togetting_better

在ubuntu中创建了一个python服务,并用systemctl启动它。报告了一个错误,即找不到脚本中使用的python模块[重复]

  •  -2
  • on_the_way_togetting_better  · 技术社区  · 2 年前

    有了之前的几十个答案,我很惊讶什么都找不到。。。

    我正在使用 paho mqtt库,用于一个非常简单的python程序来报告一些数据(在Raspberry Pi上运行)。我从python程序(My_program.py)中导入的内容是:

    import paho.mqtt.client as mqtt
    

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

    从运行的bash脚本/systemd-

    ## 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 设置(?)。

    0 回复  |  直到 6 年前
        1
  •  7
  •   Bill Armstrong    6 年前

    我想我已经弄清楚问题是什么了。。。 systemd 默认情况下运行其服务 root 。我认为(见下文),这将/应该允许将事情等效为 为其他用户或实际用户使用sudo cli上的user。

    我只关注systemd的服务文件,在 man pages 有一个 [Service] 参数,用于指定运行服务的人员。在这种情况下,我尝试将参数设置为:

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

    这使得服务能够在没有错误的情况下运行(上面提到的错误)。

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

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

    原因:

    对于其他发现自己在这里的人,如果您省略 User= 的参数 【服务】 部分,默认为 。但是,这与设置 用户= 参数到 (例如。, User=root )或者发送给另一个用户(在我的例子中是pi)。

    我并不真正理解其中的细微差别,但从上的文档来看 environmental variables 这个 用户= 参数用于设置 $PATH 变量如果服务文件没有 用户= 我认为这会导致路径分配出现问题。我想这就是为什么设置 用户= 使用pi或root解决了这个问题,而使用默认值似乎会导致这个问题。

    欢迎解释和教育。谢谢

        2
  •  1
  •   elam    6 年前

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

    sudo -H pip3 install --system paho-mqtt
    

    此外,我注意到您的导入是错误的。您写道: import pho.mqtt.client as mqtt

    它应该是:

    import paho.mqtt.client as mqtt
    
        3
  •  0
  •   thb    6 年前

    尝试使用root安装模块。