You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过SSH运行树莓派激光绊线Python脚本时出现报错求助

通过SSH运行树莓派激光绊线Python脚本时出现报错求助

嘿,我来帮你拆解并解决这个问题!你遇到的报错其实是两个小问题凑到一块儿导致的:系统没把你的脚本当成Python程序执行,再加上脚本本身有个语法小漏洞,咱们一步步搞定它:

问题根源分析

先看你拿到的报错:from: can't read /var/mail/gpiozero,这说明SSH环境下系统默认用shell来执行你的脚本了——shell会把Python里的from当成它自己的命令,自然找不到对应的gpiozero相关指令,直接报错。另外还有个语法错误,是你脚本里else块的写法不符合Python规则。

具体解决步骤

1. 给脚本加上Python解释器声明(Shebang行)

在你的Python脚本最顶部,加上这一行:

#!/usr/bin/env python3

这行的作用是明确告诉系统:“这玩意儿是Python3脚本,要用Python3来运行”,这样你直接敲./Laser_Tripwire.py的时候,系统就不会乱拿shell去解析它了。

2. 修复脚本里的语法和缩进问题

Python对缩进要求特别严格,而且空代码块不能用(),得用pass占位。我把你原来的脚本修正了缩进和错误,你可以直接用:

#!/usr/bin/env python3
from gpiozero import LightSensor
from time import sleep
import requests

ldr = LightSensor(4)

while True:
    sleep(.5)
    print(ldr.value)
    if ldr.value < .5:
        requests.post("http://192.168.1.33/message?token=Ah9v9xauxuhmEJ_",
            json={"title":"Laser Tripwire",
                  "priority": 4,
                  "message":"The alarm has been triggered!"})
        sleep(10)
    else:
        pass
  • 把原来的else: ()改成了else: pass,这是Python里表示空代码块的标准写法
  • 统一用4个空格缩进所有代码块,比如while循环里的sleep(.5)print语句,还有if/else块里的内容,这样Python才能正确识别代码层级

3. 给脚本加上执行权限(可选)

如果想直接用./Laser_Tripwire.py运行脚本,得给它加执行权限,在SSH里敲这个命令:

chmod +x Laser_Tripwire.py

4. 更简单的替代方案:直接用Python命令执行

要是不想改脚本和加权限,也可以直接在SSH里用Python命令启动脚本,比如:

python3 Laser_Tripwire.py

这样系统会直接调用Python3来解析脚本,完全不会出现把它当shell脚本执行的问题。

为啥本地运行没问题?

大概率是你在本地树莓派上运行时,是用Python命令启动的(比如python3 Tripwire.py),或者桌面环境的文件管理器自动关联了Python脚本,用Python打开;但SSH是纯命令行环境,直接敲脚本名的话,系统会默认用shell执行,就出问题了。

备注:内容来源于stack exchange,提问作者Vman680

火山引擎 最新活动