运行generate_lib创建micro-ROS固件时遇Jinja2导入错误求助
问题:micro-ROS固件工作空间创建失败,Jinja2依赖冲突导致ament_package构建错误
我正在为micro-ROS与Teensy通信制作自定义消息,参考micro-ROS官方教程创建新类型,教程第一步要求进入firmware/mcu_ws目录,因此执行ros2 run micro_ros_setup create_firmware_ws.sh generate_lib命令尝试创建该目录,但始终失败。已尝试重新安装micro-ROS、Python3及python3-catkin-pkg,问题仍未解决。
错误输出
(因字符长度限制,已移除前约40行克隆过程日志) === ./ros2/rosidl_defaults (git) === 正在克隆到 '.'... === ./ros2/test_interface_files (git) === 正在克隆到 '.'... === ./ros2/unique_identifier_msgs (git) === 正在克隆到 '.'... ........... === ./eProsima/Micro-CDR (git) === 正在克隆到 '.'... === ./eProsima/Micro-XRCE-DDS-Client (git) === 正在克隆到 '.'... === ./uros/micro_ros_msgs (git) === 正在克隆到 '.'... === ./uros/micro_ros_utilities (git) === 正在克隆到 '.'... === ./uros/rcl (git) === 正在克隆到 '.'... === ./uros/rclc (git) === 正在克隆到 '.'... === ./uros/rcutils (git) === 正在克隆到 '.'... === ./uros/rmw_microxrcedds (git) === 正在克隆到 '.'... === ./uros/rosidl_typesupport (git) === 正在克隆到 '.'... === ./uros/rosidl_typesupport_microxrcedds (git) === 正在克隆到 '.'... === ./uros/tracetools (git) === 正在克隆到 '.'... 交叉编译环境:清理路径 [0.683s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/example_interfaces'不存在 [0.683s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/microxrcedds_client'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/microcdr'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/micro_ros_agent'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/CarCom'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/MXObjects'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/install/MXJoystick'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/microros_ws/install/microxrcedds_client'不存在 [0.684s] 警告:colcon.colcon_ros.prefix_path.catkin:环境变量CMAKE_PREFIX_PATH中的路径'/home/fabi/projects/microros_ws/install/microcdr'不存在 开始 >>> ament_package 开始 >>> ament_lint 开始 >>> gtest_vendor 开始 >>> ament_cppcheck 开始 >>> ament_pycodestyle 完成 <<< gtest_vendor [1.83s] 开始 >>> gmock_vendor 完成 <<< gmock_vendor [0.24s] --- 标准错误输出: ament_package 回溯(最近的调用最后): 文件"/usr/lib/python3/dist-packages/colcon_core/executor/__init__.py", 第91行, 在 __call__ rc = await self.task(*args, **kwargs) 文件"/usr/lib/python3/dist-packages/colcon_core/task/__init__.py", 第93行, 在 __call__ return await task_method(*args, **kwargs) 文件"/usr/lib/python3/dist-packages/colcon_ros/task/ament_python/build.py", 第105行, 在 build return await extension.build(additional_hooks=additional_hooks) 文件"/usr/lib/python3/dist-packages/colcon_core/task/python/build.py", 第59行, 在 build available_commands = await self._get_available_commands( 文件"/usr/lib/python3/dist-packages/colcon_core/task/python/build.py", 第142行, 在 _get_available_commands output = await check_output( 文件"/usr/lib/python3/dist-packages/colcon_core/subprocess.py", 第128行, 在 check_output assert not rc, f'预期 {args} 执行成功: {stderr_data}' AssertionError: 预期 ['/usr/bin/python3', 'setup.py', '--help-commands'] 执行成功: 回溯(最近的调用最后): 文件"setup.py", 第6行, 在 <module> setup( 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/__init__.py", 第87行, 在 setup return distutils.core.setup(**attrs) 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_distutils/core.py", 第164行, 在 setup ok = dist.parse_command_line() 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_distutils/dist.py", 第471行, 在 parse_command_line if self.handle_display_options(option_order): 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/dist.py", 第1185行, 在 handle_display_options return _Distribution.handle_display_options(self, option_order) 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_distutils/dist.py", 第685行, 在 handle_display_options self.print_commands() 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/dist.py", 第962行, 在 print_commands cmdclass = ep.load() 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", 第194行, 在 load module = import_module(match.group('module')) 文件"/usr/lib/python3.8/importlib/__init__.py", 第127行, 在 import_module return _bootstrap._gcd_import(name[level:], package, level) 文件"<frozen importlib._bootstrap>", 第1014行, 在 _gcd_import 文件"<frozen importlib._bootstrap>", 第991行, 在 _find_and_load 文件"<frozen importlib._bootstrap>", 第975行, 在 _find_and_load_unlocked 文件"<frozen importlib._bootstrap>", 第671行, 在 _load_unlocked 文件"<frozen importlib._bootstrap_external>", 第848行, 在 exec_module 文件"<frozen importlib._bootstrap>", 第219行, 在 _call_with_frames_removed 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/setup_command.py", 第20行, 在 <module> from sphinx.application import Sphinx 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/application.py", 第43行, 在 <module> from sphinx.registry import SphinxComponentRegistry 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/registry.py", 第24行, 在 <module> from sphinx.builders import Builder 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/builders/__init__.py", 第26行, 在 <module> from sphinx.util import import_object, logging, progress_message, rst, status_iterator 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/util/rst.py", 第21行, 在 <module> from jinja2 import Environment, environmentfilter 导入错误: 无法从'jinja2'导入名称'environmenfilter' (/home/fabi/.local/lib/python3.8/site-packages/jinja2/__init__.py) --- 失败 <<< ament_package [2.52s, 退出码1] 终止 <<< ament_pycodestyle [2.46s] 终止 <<< ament_lint [2.52s] 终止 <<< ament_cppcheck [2.51s] 摘要: 2个包构建完成 [2.99s] 1个包构建失败: ament_package 3个包构建终止: ament_cppcheck ament_lint ament_pycodestyle 1个包有标准错误输出: ament_package 54个包未处理 预期 ['/usr/bin/python3', 'setup.py', '--help-commands'] 执行成功: 回溯(最近的调用最后): 文件"setup.py", 第6行, 在 <module> setup( 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/__init__.py", 第87行, 在 setup return distutils.core.setup(**attrs) 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_distutils/core.py", 第164行, 在 setup ok = dist.parse_command_line() 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_distutils/dist.py", 第471行, 在 parse_command_line if self.handle_display_options(option_order): 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/dist.py", 第1185行, 在 handle_display_options return _Distribution.handle_display_options(self, option_order) 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_distutils/dist.py", 第685行, 在 handle_display_options self.print_commands() 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/dist.py", 第962行, 在 print_commands cmdclass = ep.load() 文件"/home/fabi/.local/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", 第194行, 在 load module = import_module(match.group('module')) 文件"/usr/lib/python3.8/importlib/__init__.py", 第127行, 在 import_module return _bootstrap._gcd_import(name[level:], package, level) 文件"<frozen importlib._bootstrap>", 第1014行, 在 _gcd_import 文件"<frozen importlib._bootstrap>", 第991行, 在 _find_and_load 文件"<frozen importlib._bootstrap>", 第975行, 在 _find_and_load_unlocked 文件"<frozen importlib._bootstrap>", 第671行, 在 _load_unlocked 文件"<frozen importlib._bootstrap_external>", 第848行, 在 exec_module 文件"<frozen importlib._bootstrap>", 第219行, 在 _call_with_frames_removed 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/setup_command.py", 第20行, 在 <module> from sphinx.application import Sphinx 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/application.py", 第43行, 在 <module> from sphinx.registry import SphinxComponentRegistry 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/registry.py", 第24行, 在 <module> from sphinx.builders import Builder 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/builders/__init__.py", 第26行, 在 <module> from sphinx.util import import_object, logging, progress_message, rst, status_iterator 文件"/home/fabi/.local/lib/python3.8/site-packages/sphinx/util/rst.py", 第21行, 在 <module> from jinja2 import Environment, environmentfilter 导入错误: 无法从'jinja2'导入名称'environmenfilter' (/home/fabi/.local/lib/python3.8/site-packages/jinja2/__init__.py)
解决方案
问题根源是Jinja2版本不兼容:Jinja2 3.1.0及以上版本移除了environmentfilter接口,而当前环境中的Sphinx版本较旧,仍在调用该接口,导致导入错误。
解决步骤:
- 降级Jinja2到兼容版本(推荐3.0.3):
pip3 install jinja2==3.0.3 --user
- 或者升级Sphinx到支持新版本Jinja2的版本:
pip3 install --upgrade sphinx --user
- 重新执行创建固件工作空间的命令:
ros2 run micro_ros_setup create_firmware_ws.sh generate_lib
内容的提问来源于stack exchange,提问作者Fabian Hofmann
相关产品推荐
相关产品推荐

