通过指定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 <module>
    import rospy
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 49, in <module>
    from .client import spin, myargv, init_node, \
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/client.py", line 52, in <module>
    import roslib
  File "/opt/ros/noetic/lib/python3/dist-packages/roslib/__init__.py", line 50, in <module>
    from roslib.launcher import load_manifest  # noqa: F401
  File "/opt/ros/noetic/lib/python3/dist-packages/roslib/launcher.py", line 42, in <module>
    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 <module>
    import rospy
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 47, in <module>
    from std_msgs.msg import Header
  File "/opt/ros/noetic/lib/python3/dist-packages/std_msgs/msg/__init__.py", line 1, in <module>
    from ._Bool import *
  File "/opt/ros/noetic/lib/python3/dist-packages/std_msgs/msg/_Bool.py", line 6, in <module>
    import genpy
  File "/opt/ros/noetic/lib/python3/dist-packages/genpy/__init__.py", line 34, in <module>
    from . message import Message, SerializationError, DeserializationError, MessageException, struct_I
  File "/opt/ros/noetic/lib/python3/dist-packages/genpy/message.py", line 48, in <module>
    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文件开头指定解释器,可以避免安装包已经下载,却提示找不到安装包的问题。

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

  • 浏览量 5982
  • 收藏 0
  • 0

所有评论(0)