我使用了仅适用于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。
如何将此文件导入笔记本?
答案 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上发布的问题。