栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

通过指定python解释器解决ImportError: No module named rospkg的问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过指定python解释器解决ImportError: No module named rospkg的问题

通过指定python解释器解决importError: No module named rospkg的问题
  • 问题描述
  • 探索过程
  • 解决方法
  • 总结

第一次写博客,CSDN上很太多类似问题的解决方法,但是解决不了我的问题,这次好不容易解决了我的问题,希望记录一下这个解决方法,帮助到有类似问题的同学。可能写的不对,可能写得让人看不太懂,探索过程其实没什么用,可以直接跳到 解决方法

问题描述

从github上down了ethz-asl/panoptic_mapping这个工程,在执行roslaunch panoptic_mapping_ros run.launch命令时报错importError: No module named rospkg

环境ubutnu20.04,已经成功安装了ros noetic,当前的环境是python3.8.5,曾经安装过python3.7和python3.9,还有ubuntu自带的python2.7,曾经安装过anaconda,但是这里没有激活conda环境,没有冲突。下面是完整的报错信息:

Traceback (most recent call last):
  File "/home/leequer/catkin_ws/src/panoptic_mapping/panoptic_mapping_utils/src/flat_dataset/flat_data_player.py", line 7, in 
    import rospy
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 49, in 
    from .client import spin, myargv, init_node, 
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/client.py", line 52, in 
    import roslib
  File "/opt/ros/noetic/lib/python3/dist-packages/roslib/__init__.py", line 50, in 
    from roslib.launcher import load_manifest  # noqa: F401
  File "/opt/ros/noetic/lib/python3/dist-packages/roslib/launcher.py", line 42, in 
    import rospkg
importError: No module named rospkg

探索过程

网上很多讲import rospkg失败的原因是与anaconda冲突,在~/.bashrc文件中注释anaconda的部分,然后重新source。

但是我这里并没有这个冲突,也没有安装到python2中,在bashrc文件注释anaconda也没用,pip install rospkg提示已经安装在/usr/lib/python3/dist-packages中,直接在终端进入python环境import这两个包可以成功导入:

leequer@leequer-PC:~/catkin_ws/devel$ python
Python 3.8.5 (default, May 27 2021, 13:30:53) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import rospy
>>> import rospkg
>>> rospy.__file__
'/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py'
>>> rospkg.__file__
'/usr/lib/python3/dist-packages/rospkg/__init__.py'
>>> 

但是在执行roslaunch panoptic_mapping_ros run.launch的时候就报错。

考虑到报错中,rospy和roslib安装在/opt/ros/noetic/lib/python3/dist-packages/中,是不是将rospkg安装在相同目录中,可以解决?于是尝试直接将rospkg包从前一个目录复制到后一个目录,果然rospkg报错消失,但是报新的错误,是rospkg的依赖包缺失,于是用下面的命令指定安装目录,安装rospkg:

sudo pip install --target=/opt/ros/noetic/lib/python3/dist-packages rospkg

由于之前的复制,提示rospkg已存在,使用–upgrade来覆盖原有的包

sudo pip install --target=/opt/ros/noetic/lib/python3/dist-packages rospkg --upgrade

还是有报错:

ERROR: launchpadlib 1.10.13 requires testresources, which is not installed.

安装了testresources之后,执行roslaunch panoptic_mapping_ros run.launch报错发生变化:

Traceback (most recent call last):
  File "/home/leequer/catkin_ws/src/panoptic_mapping/panoptic_mapping_utils/src/flat_dataset/flat_data_player.py", line 7, in 
    import rospy
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 47, in 
    from std_msgs.msg import Header
  File "/opt/ros/noetic/lib/python3/dist-packages/std_msgs/msg/__init__.py", line 1, in 
    from ._Bool import *
  File "/opt/ros/noetic/lib/python3/dist-packages/std_msgs/msg/_Bool.py", line 6, in 
    import genpy
  File "/opt/ros/noetic/lib/python3/dist-packages/genpy/__init__.py", line 34, in 
    from . message import Message, SerializationError, DeserializationError, MessageException, struct_I
  File "/opt/ros/noetic/lib/python3/dist-packages/genpy/message.py", line 48, in 
    import yaml
  File "/opt/ros/noetic/lib/python3/dist-packages/yaml/__init__.py", line 362
    class YAMLObject(metaclass=YAMLObjectmetaclass):
                              ^
SyntaxError: invalid syntax

在stackoverflow中的解答Failed to launch rospy file: SyntaxError: invalid syntax YAMLObject(metaclass=YAMLObjectmetaclass):中发现这样的解答:

I found the solution!
Turns out all I had to do was to change #!/usr/bin/env python import rospy To: #!/usr/bin/env python3 import rospy

去搜#!/usr/bin/env,找到博文#!/usr/bin/python3 和 #!/usr/bin/env python3 的作用,终于明白出错的原因和解决的方法。

解决方法

原来python文件的开头会指定python解释器,而#!/usr/bin/env python的作用就是在环境中自己找,找到哪个算哪个,当然容易出错!找到报错信息中的python文件,我这里是flat_data_player.py,打开这个文件,

在报错的python文件开头,将#!/usr/bin/env python改成#!/usr/bin/python3.8,指定python解释器,终于不再报错,问题解决。

总结

#!/usr/bin/env/ python3 表示从 "PATH 环境变量"中查找 python3 解释器的位置, 路径没有被写死, 而是在"环境变量"中寻找 python3 解释器的安装路径, 再调用该路径下的解释器来执行脚本.
显然, 采用 #!/usr/bin/env python3 的写法更灵活更具有通用性, 推荐使用这种写法
作者:patiencing
链接:https://www.jianshu.com/p/400c612381dd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

虽然这种写法灵活,但是对于我们这些不熟悉ubuntu环境配置的菜鸟来说经常出错,常见的错误是anaconda和ros的python环境冲突,我这次遇到的错误可能不太常见,但总归是python解释器选择的问题。通过在python文件开头指定解释器,可以避免安装包已经下载,却提示找不到安装包的问题。

主要的两篇参考博客在文中以超链接的形式给出,这里不再单列

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649049.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号