通过paramiko SSHClient执行Python文件时遇rospy模块导入错误
解决Paramiko执行Python脚本时找不到rospy的问题
这个问题我之前也碰到过!本质原因是paramiko的exec_command默认启动的是非交互式shell,不会自动加载你平时终端里的那些环境变量——比如ROS的setup脚本,而rospy依赖的正是这些环境变量才能被Python找到。而你直接在终端执行时,终端是交互式shell,会自动加载~/.bashrc或者/opt/ros/<版本>/setup.bash里的配置,所以能正常找到rospy。
下面给你几个靠谱的解决办法:
显式加载ROS环境变量后执行脚本
在exec_command里先source ROS的setup文件,再运行Python脚本。比如你的ROS版本是noetic的话,命令可以写成这样:stdin, stdout, stderr = ssh.exec_command('source /opt/ros/noetic/setup.bash && python path/to/file.py')注意把
noetic换成你实际使用的ROS版本(比如melodic、humble)。使用ROS环境下的Python解释器路径
直接指定ROS安装目录里的Python解释器来运行脚本,这样它会自动识别rospy的位置:# 以noetic为例,Python3的路径 stdin, stdout, stderr = ssh.exec_command('/opt/ros/noetic/bin/python3 path/to/file.py')让shell加载用户的完整环境
用bash -lc命令来强制加载交互式shell的环境配置(会读取~/.bashrc),这样就能和你手动在终端执行的环境一致了:stdin, stdout, stderr = ssh.exec_command('bash -lc "python path/to/file.py"')这里要注意引号的转义,或者用单引号包裹命令。
检查脚本的shebang行
如果你的Python脚本开头有#!/usr/bin/env python,可以改成指向ROS环境里的Python路径,比如:#!/opt/ros/noetic/bin/python3这样即使直接执行脚本,也会用正确的Python解释器。
内容的提问来源于stack exchange,提问作者zgracia
相关产品推荐
相关产品推荐

