【问题标题】:ModuleNotFoundError when importing from a ROS package从 ROS 包导入时出现 ModuleNotFoundError
【发布时间】:2020-09-19 10:41:17
【问题描述】:

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

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

【问题讨论】:

  • 您可能需要明确地将模块添加到您的路径中。 import sys 然后sys.path.insert(0, "/path/to/your/package_or_module")
  • @VarunNayak 这样做会为其他模块带来相同的错误。在明确添加这些模块之后。它最终为我提供了 /opt/ros/indigo/lib/python2.7/dist-packages 中文件的语法。我不明白它怎么会在笔记本中出现语法错误,而在其他情况下它工作得很好。
  • 一定要用python3吗? Ros indigo 是在 python2 之上设计的。如果你想保证原生 ros 以 python3 为目标,如果你不必使用 ubuntu 14,则可以使用适用于 ubuntu 20 的 ros noetic。

标签: python jupyter-notebook virtualenv ros


【解决方案1】:

有几件事。请记住,您可以通过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)并给出致命错误。

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

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

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 2021-01-26
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2021-05-10
    • 2021-05-09
    • 2021-07-12
    • 2021-09-03
    相关资源
    最近更新 更多