从ROS包导入时发生ModuleNotFoundError

时间:2020-06-01 06:47:16

标签: python jupyter-notebook virtualenv ros

我使用了仅适用于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。

如何将此文件导入笔记本?

1 个答案:

答案 0 :(得分:0)

有几件事。请记住,您可以通过shebang in your script指定要运行的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代码(printing the version number),包括tensorflow。问题在于,它试图在py3而不是py2上import rospy时,找不到它的某些依赖项(例如rospkg)并给出致命错误。

要解决此问题(假设您不切换到具有本机py3支持的Ubuntu 20 + ROS Noetic,或仅使用py2),则可以从py2 ros节点调用py3脚本,例如使用{{3 }和管道。或者更好的是,subprocess通过localhost将您的数据/图像/结果/输入发送出去,这可能是最简单的方法。为此,(并且它起作用了!)在两侧建立一个import socket udp连接到本地主机(127.0.0.1)随机端口(例如5050)。启动两个脚本。您的py3脚本无法import rospy,但是可以导入ros msgs:from sensor_msgs.msg import Image。您可以找到socket udp的方法(有多种方法可以将py obj转换为字符串并返回)。

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