You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Paramiko通过SSH运行树莓派拍照Python脚本异常排查

问题分析与解决方案

这大概率不是Unix权限问题,而是工作目录不一致导致文件生成在了你没注意到的位置,而非脚本执行失败。

为什么会出现这个差异?

当你用Putty登录树莓派时,默认工作目录是/home/pi,脚本里用相对路径foo.jpg保存时,文件会生成在/home/pi/foo.jpg——这正是你预期的位置。

但通过Paramiko的exec_command执行sudo python /home/pi/camera/pictaker.py时:

  • sudo会切换到root用户身份执行命令;
  • exec_command默认的工作目录是root用户的家目录(也就是/root/);
  • 脚本用相对路径保存图片,最终foo.jpg其实生成在了/root/foo.jpg,而非你预期的/home/pi/下,所以你找不到它。

你能看到foo.jpg captured的打印信息,说明脚本确实完整执行了——如果是权限问题,camera.capture()会抛出异常,你应该能在stderr里看到错误日志。

解决方法(任选其一即可)

  1. 在脚本中使用绝对路径保存图片
    修改树莓派端的脚本,把相对路径改成固定的绝对路径,比如:

    # 替换原来的camera.capture('foo.jpg')
    camera.capture('/home/pi/foo.jpg')
    

    这样无论在哪个工作目录执行脚本,图片都会固定生成在/home/pi/下。

  2. 执行命令时指定工作目录
    在Paramiko的命令里,先切换到目标目录再执行脚本(需要通过shell执行组合命令):

    remoteHelper.runRemoteCommand("sudo bash -c 'cd /home/pi && python camera/pictaker.py'")
    

    这样脚本执行时的工作目录就是/home/pi,相对路径生成的文件就会出现在这里。

  3. 让脚本在自身所在目录生成文件
    如果希望脚本无论在哪里执行,都把图片保存在脚本自己的目录下,可以用os模块动态获取脚本路径:

    import os
    # 获取脚本所在的绝对目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # 拼接图片的完整路径
    pic_path = os.path.join(script_dir, 'foo.jpg')
    camera.capture(pic_path)
    

    这样图片会生成在/home/pi/camera/foo.jpg(脚本所在的目录)。

内容的提问来源于stack exchange,提问作者sliders_alpha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:09:22