使用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里看到错误日志。
解决方法(任选其一即可)
在脚本中使用绝对路径保存图片
修改树莓派端的脚本,把相对路径改成固定的绝对路径,比如:# 替换原来的camera.capture('foo.jpg') camera.capture('/home/pi/foo.jpg')这样无论在哪个工作目录执行脚本,图片都会固定生成在
/home/pi/下。执行命令时指定工作目录
在Paramiko的命令里,先切换到目标目录再执行脚本(需要通过shell执行组合命令):remoteHelper.runRemoteCommand("sudo bash -c 'cd /home/pi && python camera/pictaker.py'")这样脚本执行时的工作目录就是
/home/pi,相对路径生成的文件就会出现在这里。让脚本在自身所在目录生成文件
如果希望脚本无论在哪里执行,都把图片保存在脚本自己的目录下,可以用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
相关产品推荐
相关产品推荐

