首页 > 解决方案 > 从 ROS 包导入时出现 ModuleNotFoundError

问题描述

我使用了仅适用于 ROS Indigo 的机器人模拟器。我还必须使用 Tensorflow 和 Jupyter Notebook,所以我用 Python3.6 创建了一个虚拟环境。

我想从笔记本的模拟器包中导入一个文件。因此,在我为 virtualenv 获取 bin/activate 之后,我从我的 catkin 工作区获取了 devel/setup.bash。但即使这样做了,我也会收到以下错误

ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-8-8370e76446ee> in <module>
----> 1 import herbpy

~/my_workspace/devel/lib/python2.7/dist-packages/herbpy/__init__.py in <module>
     33 for __execfile in __execfiles:
     34     with open(__execfile, 'r') as __fh:
---> 35         exec(__fh.read())
     36     del __fh
     37     del __execfile

~/my_workspace/devel/lib/python2.7/dist-packages/herbpy/__init__.py in <module>

ModuleNotFoundError: No module named 'herb'

我尝试运行导入此模块的 python 文件(在环境中)。它只与 python2 一起运行。但是对于python2,我不能使用Tensorflow。

如何在我的笔记本中导入此文件?

标签: pythonjupyter-notebookvirtualenvros

解决方案


有几件事。请记住,您可以通过脚本中的 shebang指定要运行的 python 版本:

#!/usr/bin/env python  # For "both" versions, not recommended for ros
#!/usr/bin/env python2 # For ros, to access the python/pip packages only installed for py2
#!/usr/bin/env python3 # For python3 code, to avoid that 'python' usually selects py2

您可以通过这种方式从启动文件中调用不同的 python 可执行文件:

<?xml version="1.0"?>
<launch>
  <!-- py3_ex.launch -->
    <node name="call_py3" pkg="my_new_pkg" type="call_py3.py" output="screen">
    </node>
</launch>
#!/usr/bin/env python3
# call_py3.py
# Try to print out the python version
import sys
import platform
#import rospy

#rospy.init_node("call_py3");
print("\n\nPython Version:\n")
print(sys.version)
print(platform.python_version())
print("\n\n")
#rospy.spin()

上面的脚本将运行 python3 代码(打印版本号),包括 tensorflow。问题是,在尝试import rospy使用 py3 而不是 py2 时,它不会找到它的一些依赖项(例如 rospkg)并给出致命错误。

为了解决这个问题,(假设你没有切换到 Ubuntu 20 + ROS Noetic,支持原生 py3,或者只使用 py2),你可以从你的 py2 ros 节点调用 py3 脚本,例如使用进程和管道。或者更好的是,socket udp通过 localhost 发送您的数据/图像/结果/输入,这可能是最简单的方法。为此,(它有效!)import socket在双方建立一个到本地主机(127.0.0.1)随机端口(例如 5050)的 udp 连接。启动两个脚本。您的 py3 脚本不能import rospy,但它可以导入 ros msgs: from sensor_msgs.msg import Image。您可以找到一种对其进行序列化的方法(有多种方法可以将 py obj 转换为字符串并返回)。

设置 python3 的一种更痛苦的方法(但之后应该更容易使用)是以某种方式替换 python2 包以将 ros 与 python3 一起使用。那里有很多指南,并且很多人遇到了在 SO 上发布的问题。


推荐阅读