ROS 2 Humble编译unitree_api报错:ModuleNotFoundError: No module named 'em'
解决ROS2 Humble编译unitree_api时
ModuleNotFoundError: No module named 'em'的问题 核心原因
ROS2的消息/服务生成工具依赖empy库(提供em模块),但Python虚拟环境默认隔离了系统site-packages,导致编译时虚拟环境内的Python无法找到已安装的em模块;即使你在系统或虚拟环境内装过empy,也可能因为环境变量或依赖版本优先级问题导致无法识别。
可行解决方案
方案1:让虚拟环境继承系统Python包
创建虚拟环境时添加--system-site-packages参数,让虚拟环境包含系统级安装的Python包(包括python3-empy):
# 未创建虚拟环境的话,用此命令创建 python3 -m venv --system-site-packages your_venv_name # 已创建虚拟环境的情况,先激活,再手动添加系统site-packages路径 source your_venv_name/bin/activate # 获取系统python3的site-packages路径 PYTHON_SITE_PACKAGES=$(python3 -c "import site; print(site.getsitepackages()[0])") # 将路径写入虚拟环境的包索引文件 echo $PYTHON_SITE_PACKAGES > your_venv_name/lib/python3.10/site-packages/system-packages.pth
方案2:在虚拟环境内适配ROS2版本安装empy
- 激活虚拟环境:
source your_venv_name/bin/activate
- 清理冲突包:
pip uninstall -y empy em sudo apt remove -y python3-empy
- 安装ROS2 Humble适配的
empy版本(推荐3.3.4):
pip install empy==3.3.4
- 按顺序加载环境后编译:
source /opt/ros/humble/setup.bash source your_venv_name/bin/activate colcon build --packages-select unitree_api
方案3:临时使用系统Python编译(应急用)
如果虚拟环境不是必须的,可以取消激活虚拟环境,直接用系统Python编译:
source /opt/ros/humble/setup.bash deactivate colcon build --packages-select unitree_api
验证方法
编译前在虚拟环境内检查em模块是否可导入:
source your_venv_name/bin/activate python3 -c "import em; print('em module found')"
如果输出em module found,说明模块已正确安装,再执行编译即可。
内容的提问来源于stack exchange,提问作者KANISHK KHANDELWAL
相关产品推荐
相关产品推荐

