|
【ros问题记录】问题描述ImportError:dynamicmoduledoesnotdefinemoduleexportfunction(PyInit__tf2)Traceback(mostrecentcalllast):File"/home/mandy/ross/racecar_ws/src/Map_construction-Navigation_simulation/racecar_gazebo/scripts/XL_controller_cmd.py",line18,inimporttfFile"/opt/ros/melodic/lib/python2.7/dist-packages/tf/__init__.py",line30,infromtf2_rosimportTransformExceptionasException,ConnectivityException,LookupException,ExtrapolationExceptionFile"/opt/ros/melodic/lib/python2.7/dist-packages/tf2_ros/__init__.py",line38,infromtf2_pyimport*File"/opt/ros/melodic/lib/python2.7/dist-packages/tf2_py/__init__.py",line38,infrom._tf2import*ImportError:dynamicmoduledoesnotdefinemoduleexportfunction(PyInit__tf2)12345678910方法一主要参考:但貌似这博主是官网照抄的,这里根据实际情况进行修改方法一是整个ros工作空间都在python3下编译工作更新:我发现这个方法一点都不好用,因为rosmelodic本来就是基于python2.7设计的,换到python3运行bug太多了,比如xacro:include会出现下面的问题。ArgException是一个Python异常,xacro可能是一个基于Python的工具,所以我思考了许久觉得这个错误可能是因为python版本不兼容,而我也不会把底层源码改到兼容……所以还是老老实实用python2.7吧……问题分析所以回到最初,理清楚问题是什么,参考1,方法一参考的博主的参考参考2,ROSMelodic中使用Python3和tf2实现位姿的坐标变换在ros工作空间里找到引用的出问题的包(比如tf_ros)模块的python源码,print一下看看引入的模块来自哪个位置,如图可以看到我这引用的是来自python2.7的,fromtf2_rosimport*print("tf2_rosmodulepath:",tf2_ros.__file__)12--------------------------------------------------------------------------------------------------------------------------方法二:更改python脚本的shebang行那为什么会出现ImportError:dynamicmoduledoesnotdefinemoduleexportfunction(PyInit__tf2)的问题?首先排除没有安装这个包,没安就sudoapt-getinstall一下sudoapt-getinstallros-melodic-tf2-rosros-melodic-tf2-geometry-msgs1然后,确保你引用的这个包的python文件的Shebang行#!*****写对了,是你想要python解释器,如过你是想要默认的python2.7的解释器就写第一条,如果是想要python3的解释器就写第二条,如此类推(不确定解释器路径的就which一下)#!/usr/bin/python#!/home/mandy/anaconda3/envs/py36sarl/bin/python123总结:针对本身就安装在python2下的tf包,python源文件直接shebang行用#!/usr/bin/python就可以,不用其他乱七八糟的操作,非常简单-------------------------------------------------------------------------------------------------------------方法三:参考2,重装tf2_py使能在python3下使用根据参考2中的描述,总结了一下自己的操作把geometry2从github上下到catkin_ws/src下,我这里因为是操作过方法一,用wstool管理geometry2包。但单纯gitclone应该也没问题,我感觉这个方法和wstool、rosdep没啥关系…?#使用wstool管理geometry2包wstoolinitwstoolset-ysrc/geometry2--githttps://github.com/ros/geometry2-v0.6.5wstooluprosdepinstall--from-pathssrc--ignore-src-y-r12345在catkin_ws/src/geometry2/tf2_py/下的CMakeLists.txt里,在project(tf2_py)后添加三行set,PYTHON_EXECUTABLE、PYTHON_INCLUDE_DIR、PYTHON_LIBRARY参数的获取方法可以往下翻到方法一project(tf2_py)set(PYTHON_EXECUTABLE/home/mandy/anaconda3/envs/py36sarl/bin/python)set(PYTHON_INCLUDE_DIR/home/mandy/anaconda3/envs/py36sarl/include/python3.9)set(PYTHON_LIBRARY/home/mandy/anaconda3/envs/py36sarl/lib/libpython3.9.so)123456cd到catkin_ws文件夹下,catkinbuild,然后sourcedevel/setup.bash(注:不用catkin_make了,其实我不懂这个区别在哪里)$rm-rfbuilddevel$catkinbuild12然后顺利的话,就能在devel/lib/python3/dist-packages/下看到生成了Python3可运行的功能包$lsdevel/lib/python3/dist-packages/tf2_pytf2_ros12$sourcedevel/setup.bash1修改catkin_ws下的引用到这个模块的python脚本的shebang行,选择你前面cmakelist里修改使用的python解释器。以及将包所在的路径插入到sys.path,确保Python优先从这个路径搜索模块#!/home/mandy/anaconda3/envs/py36sarl/bin/python1importsys#print(sys.path)sys.path.insert(0,'/home/mandy/ross/racecar_ws/devel/lib/python3/dist-packages')fromtf2_rosimport*print("tf2_rosmodulepath:",tf2_ros.__file__)12345这个时候print出来的包路径就能看到是来自我们前面编译的python3路径--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------曾经写下的方法一,作为记录就不删了运行环境::conda管理的虚拟环境,python=3.9,这里做的主要是设置一个使用python3.9虚拟环境的ros工作空间#进入虚拟环境condaactivatepy36sarl#虽然我的名字叫36但确实是3912#安装必要的python3模块sudoaptupdatesudoaptinstallpython3-catkin-pkg-modulespython3-rospkg-modulespython3-empycd~/ross/catkin_ws#进入自己的catkinworkspace#初始化工作空间让ros识别到catkin_makesourcedevel/setup.bash#使用wstool管理geometry2包wstoolinitwstoolset-ysrc/geometry2--githttps://github.com/ros/geometry2-v0.6.5wstooluprosdepinstall--from-pathssrc--ignore-src-y-r#使用Python3编译工作空间,通过设置DPYTHON_xxxxx参数catkin_make--cmake-args\-DCMAKE_BUILD_TYPE=Release\-DPYTHON_EXECUTABLE=/home/mandy/anaconda3/envs/py36sarl/bin/python\-DPYTHON_INCLUDE_DIR=/home/mandy/anaconda3/envs/py36sarl/include/python3.9\-DPYTHON_LIBRARY=/home/mandy/anaconda3/envs/py36sarl/lib/libpython3.9.so12345678910111213141516171819202122参数解释::-DPYTHON_EXECUTABLE:设置为虚拟环境中的Python可执行文件路径,确保CMake在编译过程中使用虚拟环境中的Python解释器。:-DPYTHON_INCLUDE_DIR:设置为虚拟环境中的Python头文件目录,确保CMake在编译过程中包含正确的Python头文件。:-DPYTHON_LIBRARY:设置为虚拟环境中的Python库文件路径,确保CMake在链接过程中使用正确的Python库。可以通过以下命令寻找自己的环境的这些参数:$whichpython/home/mandy/anaconda3/envs/py36sarl/bin/python$python-c"fromdistutils.sysconfigimportget_python_inc;print(get_python_inc())"/home/mandy/anaconda3/envs/py36sarl/include/python3.9$python-c"importsysconfig;print(sysconfig.get_config_var('LIBDIR'))"/home/mandy/anaconda3/envs/py36sarl/lib$ls/home/mandy/anaconda3/envs/py36sarl/lib|greplibpythonlibpython3.9.solibpython3.9.so.1.0libpython3.so12345678910如果需要,修改roslaunch脚本:roslaunch脚本的shebang行写的还是支持默认的2.7的解释器,所以需要修改为使用python3sudogedit/opt/ros/melodic/bin/roslaunch1将第一行改成;#!/usr/bin/envpython31通过这些设置可以使ROS工作空间与Python3.9环境完全兼容,避免了与系统默认的Python版本(通常是Python2.7)相关的兼容性问题。最后catkin_make的过程中可能会遇到缺包或者包不兼容的情况,pipinstall到兼容的版本就是了也或许可以通过类似的方式来确保你是在最初始的python2.7中工作的?我也不懂,欢迎大佬多多指教--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|