在执行roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch文件时,即包含arbotix模块的程序时,报错No module named ‘rospkg’ 。
报错No module named 'rospkg'
经过对大家文章的查看,发现基本集中在把环境配置为python3.或者安装rospkg。但是仍没有解决。
查看opt/ros/melodic/lib/python2.7/dist-packages,发现根本没有rospkg这个包。
使用pip install rospkg。安装成功了,但是发现dist-packages还是没有安装成功这个包。
安装成功
实在没辙。通过搜索发现usr/lib/python2.7/dist-packages中有一个rospkg文件夹。把他复制到opt/ros/melodic/lib/python2.7/dist-packages中,就解决问题了。看样子应该是import的路径不对,导致找不到rospkg文件夹。
后续来了。。。。这个rospkg是解决了,但是后边一大堆import问题。每个包都要复制一遍,还出现“ROS:ImportError: dynamic module does not define module export function (PyInit__tf2)”这种复制包都没有用的错误,真是无奈。
所以,最后问题还是集中在import的路径上。一定要把路径给改回来。先用python文件a.py:
import sys
print(sys.path)
然后分别在终端及pycharm中运行:
在终端中:
$python a.py
或者执行使用命令:
export | grep PATH
发现ubuntu中依赖的路径缺少:usr/lib/python2.7/dist-packages,要在ubuntu中增加依赖路径。
$vim ~/.bashrc
在.bashrc最后加入一句:
export PYTHONPATH="/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/yaml:$PYTHONPATH"
(后边报yaml找不到,所以加上yaml的路径)
语法:export PYTHONPATH=目录1:/目录2:$PYTHONPATH
$ source ~/.bashrc
再运行,就不会报这些库的错误了。
当然,还有其他不是import的错误,等待后续吧
接上一段,终于添加了/usr/lib/python2.7/dist-packages作为依赖路径,消除了所有import的问题。却出现语法问题:except UnicodeDecodeError, exc
except UnicodeDecodeError, exc
大意就是语法问题。在python3.6不支持这种语法,我可是明明添加了python2.7啊喂???
感谢@Eric_Pxz 提供的思路:
1、找出报错的源头,没错就是"/home/box/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_drive.py
2、直接把他的环境从python3改为python2.7
改为python2.7
修改完毕,不报语法错误:except UnicodeDecodeError, exc:。特喵的又报:ImportError:dynamic module does not define init function (init_tf2)
仔细一看,是/home/box/catkin_ws/devel/lib/python3/dist-packages/tf2_py/init.py"报的错。可是我已经把python3的路径给去掉啦??
再打印一下路径
['/home/box/\xe5\xad\xa6\xe4\xb9\xa0\xe6\x96\x87\xe6\xa1\xa3',
**'/home/box/catkin_ws/devel/lib/python3/dist-packages',**
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/yaml',
'/opt/ros/melodic/lib/python2.7/dist-packages',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/home/box/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/wx-3.0-gtk3']
唯一存在的python3路径就是:’/home/box/catkin_ws/devel/lib/python3/dist-packages’, 果然还在。
不知道怎么修改路径,就直接把整个文件夹/home/box/catkin_ws/devel/lib/python3给删除掉。再运行,就ok了:
运行ok
阿弥陀佛,研究了一个星期,终于debug完毕。
总结:
1、一定要明白ros中每个文件夹的用途。比如devel是库文件。其中有python2、3的库。如果依赖python2的程序,使用的是python3的路径,那么就会报错。
2、学会修改import的路径,debug的过程中还有一些improt问题没有写出来。总之就是用$vim ~/.bashrc修改import的路径。
3、对python的import用法要熟悉,遇到import问题可以快速明白是哪里的错误。正好这次遇到python2、3的Import问题,很是暴露出知识点的缺漏
4、学会查看终端的报错信息。本次也是通过报错信息,确定问题点。
顺便总结一下import的方法,因为遇到引用同一个文件夹中的error文件:from error import *,这句也能报错,见鬼了。所以重新总结:
import对象在同一个文件夹下
1、第一种:
import py文件
例:在一个文件夹中有a.py、b.py。
在b中就可以import a
然后x = a.函数1()
2、第二种:
from py文件 import 函数
例:在一个文件夹中有a.py、b.py。
在b中就可以from a import 函数1
然后x = 函数1()
3、第三种:
from py文件 import *
例:在一个文件夹中有a.py、b.py
在b中就可以from a import *。可以直接使用a中所有的函数了
然后x = 函数1() y = 函数2()
【建议使用第一种,防止重名的问题】
import对象在不同文件夹下
在不同的文件夹下:
1、第一种:
from 文件夹 import py文件
2、第二种:
from 文件夹.py文件 import 函数1
3、第三种:
from 文件夹.py文件 import *
4、若搜索不到该文件夹,则临时添加其路径:
sys.path.append('/home/model') #可以是相对/绝对路径