python - 从 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。
如何在我的笔记本中导入此文件?
解决方案
有几件事。请记住,您可以通过脚本中的 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 上发布的问题。
推荐阅读
- sql - 有没有办法将列与日期范围相关联?
- javascript - 如何在 child_process spawn() 调用的输出的每一行加上文本前缀?
- excel - 如何获取第 n 个特殊字符右侧的单元格内容
- tinymce - TinyMCE 中独特的自定义格式
- linux - 删除在开始位置和结束位置之间包含特定子字符串的所有行
- vue.js - Vue.js 应用程序在子路径上不返回带有 Nginx Ingress 的脚本(EKS Kubernetes)
- express - 如何在 NestJS 中安装 Express 中间件(express-openapi-validator)?
- mysql - 我无法使用 process.env.variable 连接到 mysql 数据库
- spacy - 为什么 SpaCy 会因为大写字母而改变整个依赖树?
- machine-learning - 非参考损失函数