启用Python功能后catkin_make报pyparsing语法错误的解决咨询
问题
在CMakeLists.txt中配置Python3支持后,执行catkin_make时触发语法错误,CMakeLists.txt配置内容如下:
cmake_minimum_required(VERSION 3.0.2) project(transmit) set(Python3_INCLUDE_DIRS "/usr/include/python3.6m") set(Python3_LIBRARIES "/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6.so") set(PYTHON_EXECUTABLE "/usr/bin/python3.6") find_package(catkin REQUIRED COMPONENTS roscpp rospy sensor_msgs std_msgs ) catkin_package( CATKIN_DEPENDS roscpp rospy sensor_msgs std_msgs ) include_directories( include ${catkin_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS} ) add_executable(transmit src/transmit.cpp) target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${Python3_LIBRARIES} )
执行catkin_make后终端报错:
Traceback (most recent call last): File "/opt/ros/melodic/bin/catkin_make", line 13, in <module> from catkin.builder import apply_platform_specific_defaults # noqa: E402 File "/opt/ros/melodic/lib/python2.7/dist-packages/catkin/builder.py", line 54, in <module> from catkin_pkg.packages import find_packages File "/usr/local/lib/python3.6/dist-packages/catkin_pkg/packages.py", line 38, in <module> from .package import _get_package_xml File "/usr/local/lib/python3.6/dist-packages/catkin_pkg/package.py", line 44, in <module> from catkin_pkg.condition import evaluate_condition File "/usr/local/lib/python3.6/dist-packages/catkin_pkg/condition.py", line 17, in <module> import pyparsing as pp File "/usr/local/lib/python3.6/dist-packages/pyparsing/__init__.py", line 100 major: int ^ SyntaxError: invalid syntax
解决方案
问题根源
ROS Melodic是基于Python2.7开发的,手动指定PYTHON_EXECUTABLE为Python3.6后,catkin_make在调用Python2.7环境时,错误加载了Python3版本的pyparsing库——该库使用了Python3.6+才支持的变量类型注解语法,Python2.7无法解析,因此触发语法错误。
修复步骤
1. 替换手动Python配置为CMake标准查找
删除CMakeLists.txt中手动设置的Python环境变量:set(Python3_INCLUDE_DIRS "/usr/include/python3.6m") set(Python3_LIBRARIES "/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6.so") set(PYTHON_EXECUTABLE "/usr/bin/python3.6")改用CMake官方的
find_package自动查找Python3:find_package(Python3 REQUIRED COMPONENTS Development)2. 修正include与链接配置
保持include_directories和target_link_libraries中的Python变量为CMake标准变量即可,无需修改:include_directories( include ${catkin_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${Python3_LIBRARIES} )3. 临时切换Python环境(若仍有冲突)
如果系统全局Python环境存在冲突,执行catkin_make前临时指定Python2.7的依赖路径:export PYTHONPATH=/usr/lib/python2.7/dist-packages catkin_make或者直接用Python2.7运行catkin_make:
python2.7 /opt/ros/melodic/bin/catkin_make4. 降级pyparsing库(可选)
若必须保留Python3环境,可为Python2.7安装兼容版本的pyparsing:sudo pip2 install pyparsing==2.4.7
内容的提问来源于stack exchange,提问作者Y.Z.A
相关产品推荐
相关产品推荐

