V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nidongpinyinme
V2EX  ›  Python

迫于快吐了,咨询下树莓派上 Python 自启问题

  •  
  •   nidongpinyinme · 2021-01-16 23:31:52 +08:00 · 3281 次点击
    这是一个创建于 1425 天前的主题,其中的信息可能已经有所发展或是发生改变。
    nohup python3 /home/pi/Recorder.py >> log.txt 2>&1 &
    
    
    • 我把上述代码写进了 shell 自启脚本里,脚本中另外的 sh 文件等启动正常,该 py 脚本也正常,但是自启时就会在 log 文件中提示ModuleNotFoundError: No module named 'apscheduler'
    • 检查过树莓派环境,python2.7 和 3.7 都装上了 apscheduler 库,也都可以执行,切换到 root 用户也没问题,但是在自启脚本里就是不行。
    • 自启脚本是在 rc.local 里启动的。
    18 条回复    2021-01-18 22:13:25 +08:00
    jianixrabbit
        1
    jianixrabbit  
       2021-01-16 23:59:06 +08:00 via Android
    看看脚本当时的环境变量
    imes
        2
    imes  
       2021-01-17 00:12:37 +08:00 via Android   ❤️ 1
    有 systmd 不用,跑去用歪门邪道的 rc.local,出 bug 都难修。systemd 脚本如下,安装实际情况,修改用户和路径:
    ```
    [Unit]
    Description=Python Service
    After=multi-user.target

    [Service]
    WorkingDirectory=/path/
    User=root
    Type=idle
    ExecStart=/usr/bin/python3 /path/python.py
    Restart=always

    [Install]
    WantedBy=multi-user.target
    ```
    farmer01
        3
    farmer01  
       2021-01-17 08:16:58 +08:00
    nohup /usr/bin/python3 /home/pi/Recorder.py >> log.txt 2>&1 &
    nidongpinyinme
        4
    nidongpinyinme  
    OP
       2021-01-17 09:27:35 +08:00
    @jianixrabbit 在脚本里打印了环境变量发现确实和终端执行时的不一样,少了三方库的路径,那么他读的是哪个变量呢
    nidongpinyinme
        5
    nidongpinyinme  
    OP
       2021-01-17 09:39:20 +08:00
    @imes 谢谢哥,给我推开了新世界的门
    nidongpinyinme
        6
    nidongpinyinme  
    OP
       2021-01-17 09:51:36 +08:00
    @farmer01 指定了也是不行,好像是脚本里面找不到 python 的三方库路径
    nidongpinyinme
        7
    nidongpinyinme  
    OP
       2021-01-17 09:52:14 +08:00
    @jianixrabbit 说的有点傻了,我是用 python 的 sys.path 打印的
    exiledkingcc
        8
    exiledkingcc  
       2021-01-17 11:14:20 +08:00
    你在终端里面运行的时候,会加载用户的一些环境变量。
    在 rc.local 运行的时候,没有这些东西。
    改成 systemd,然后把必要的 path 配置进去就行了。
    或者用 python 虚拟环境。
    no1xsyzy
        9
    no1xsyzy  
       2021-01-17 12:45:32 +08:00
    现在 rc.local 也是靠 systemd 里一个 rc-local.service 来启动的…… 纯粹是向后兼容的目的留着的,没必要用

    至于 sys.path 还是自己看文档吧: https://docs.python.org/3/library/sys.html#sys.path
    bao3
        10
    bao3  
       2021-01-17 15:32:34 +08:00 via iPhone
    其实对于一般的需求,rc.local 很方便,也不理解为啥系统要取消
    JamesMackerel
        11
    JamesMackerel  
       2021-01-17 17:30:52 +08:00
    PYTHONPATH 环境变量了解一下。
    nidongpinyinme
        12
    nidongpinyinme  
    OP
       2021-01-17 18:00:07 +08:00
    @exiledkingcc 我改成 systemd 可以直接用 /叹气
    nidongpinyinme
        13
    nidongpinyinme  
    OP
       2021-01-17 18:00:59 +08:00
    @no1xsyzy 敬礼
    farmer01
        14
    farmer01  
       2021-01-17 18:42:04 +08:00
    @nidongpinyinme 可以像 imes 说的,注册成系统服务,或者是在 crontab 里引用 PATH
    imycc
        15
    imycc  
       2021-01-18 01:41:50 +08:00
    py 依赖找不到的简单排错办法,启动的时候把 sys.path 打印出来,跟交互环境下的做对比。

    常见的错误是系统存在多个 py 版本,执行的时候是另一个 py 。或者你安装库的时候加了--user,把库安装到$HOME/.local 下面去了,执行的时候环境不一样。
    neroxps
        16
    neroxps  
       2021-01-18 08:44:00 +08:00
    2020 年了,还在用 rc.local

    SYSTEMD 作者现在还活的好好的
    nidongpinyinme
        17
    nidongpinyinme  
    OP
       2021-01-18 22:12:37 +08:00
    @neroxps 学会了学会了
    nidongpinyinme
        18
    nidongpinyinme  
    OP
       2021-01-18 22:13:25 +08:00
    @imycc 是的,我这边是装库位置不对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5388 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:59 · PVG 10:59 · LAX 18:59 · JFK 21:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.