Gazebo仿真运行失败:已安装netifaces模块仍提示未找到
ModuleNotFoundError: No module named 'netifaces' 你遇到的这个问题在ROS Kinetic环境里挺常见的,核心原因是ROS Kinetic绑定Python 2.7运行,但你的netifaces模块要么没正确安装到Python 2.7的路径中,要么ROS的Python环境变量没正确指向该模块所在位置。结合你的描述(终端能导入但roslaunch不行),可以按以下步骤排查解决:
先明确问题根源
首先确认ROS调用的Python版本和模块路径:
- 运行以下命令,查看Python 2.7能否正常导入
netifaces:
如果输出成功,说明模块已安装,但ROS可能没找到这个路径;如果报错,说明你之前的安装没覆盖到Python 2.7。python2.7 -c "import netifaces; print('Success! Module path:', netifaces.__file__)"
针对性解决方案
方案1:重新安装Python 2.7版本的netifaces
有时候apt install python-netifaces可能因为系统缓存或依赖问题没生效,换用pip2直接安装更可靠:
sudo pip2 install netifaces
安装完成后再运行上面的Python 2.7测试命令,确认模块存在。
方案2:检查并修复ROS的PYTHONPATH环境变量
ROS通过PYTHONPATH查找Python模块,可能这个变量没包含netifaces所在的路径:
- 先查看当前
PYTHONPATH:echo $PYTHONPATH - 如果输出里没有
/usr/lib/python2.7/dist-packages或/home/your_username/.local/lib/python2.7/site-packages(根据之前测试的模块路径),手动添加:export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages - 再次尝试运行你的roslaunch命令:
roslaunch usv_sim airboat_scenario1.launch parse:=true - 如果生效,把这个环境变量添加到
~/.bashrc里,避免每次重启终端都要设置:echo 'export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages' >> ~/.bashrc source ~/.bashrc
方案3:排查虚拟环境干扰
如果你平时用Python虚拟环境,可能运行roslaunch时不小心激活了Python 3的虚拟环境,导致ROS找不到Python 2的模块:
- 先运行
deactivate退出所有虚拟环境,再重新运行roslaunch命令测试。
方案4:验证rosgraph模块的依赖
报错是从rosgraph/network.py里触发的,可以直接检查这个文件的导入逻辑:
cd /opt/ros/kinetic/lib/python2.7/dist-packages/rosgraph cat network.py | grep -n "import netifaces"
确认第217行确实有这个导入,然后运行:
python2.7 network.py
如果报错同样找不到模块,说明问题确实出在Python 2的模块安装上,回到方案1重新安装。
附你提供的完整报错信息:
rameezs:~/catkin_ws$ roslaunch usv_sim airboat_scenario1.launch parse:=true
... logging to /home/rameezs/.ros/log/5cbbdbb0-c28f-11e9-bea5-88b111c4685a/roslaunch-thinkram-16846.log
Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
Traceback (most recent call last):
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/init.py", line 306, in main
p.start()
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/parent.py", line 268, in start
self._start_infrastructure()
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/parent.py", line 217, in _start_infrastructure
self._load_config()
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/parent.py", line 132, in _load_config
roslaunch_strs=self.roslaunch_strs, verbose=self.verbose)
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/config.py", line 471, in load_config_default
config.assign_machines()
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/config.py", line 222, in assign_machines
if [m for m in machine_unify_dict.values() if not is_machine_local(m)]:
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/config.py", line 222, in
if [m for m in machine_unify_dict.values() if not is_machine_local(m)]:
File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/core.py", line 97, in is_machine_local
local_addresses = ['localhost'] + rosgraph.network.get_local_addresses()
File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosgraph/network.py", line 217, in get_local_addresses
import netifaces
ModuleNotFoundError: No module named 'netifaces'
内容的提问来源于stack exchange,提问作者user2512219

