No module named 'mininet.cli'报错处理
问题描述
在命令行中输入python,在解释器中执行from mininet.cli import CLI
不会报错的前提下,使用make run
编译运行程序时,出现如下报错:
Traceback (most recent call last):
File "../../utils/run_exercise.py", line 29, in <module>
from mininet.cli import CLI
ModuleNotFoundError: No module named 'mininet.cli'
解决方案
在本地路径的Makefile中,找到其引用的../../utils/Makefile
文件(检查编译文件,找到执行该python文件的命令),在该命令的sudo python3 ...
之间插入-E
选项,例如:
排错过程
step1:检查mininet是否正确安装
使用pip show mininet
命令,可以看到有输出
Name: mininet
Version: 2.3.0.dev6
Summary: Process-based OpenFlow emulator
Home-page: UNKNOWN
Author: Bob Lantz
Author-email: [email protected]
License: BSD
Location: /home/cc/.local/lib/python3.8/site-packages
Requires: setuptools
Required-by:
step2:检查sys.path列表中是否含有mininet路径
在python解释器中,输入:
import sys
print(sys.path)
输出的路径包括上一步中提到的/home/cc/.local/lib/python3.8/site-packages
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/cc/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/local/lib/python3.8/dist-packages/thrift-0.13.0-py3.8-linux-x86_64.egg', '/usr/lib/python3/dist-packages']
step3:尝试指定python版本
如下所示,由于原始的提示信息中,执行该python文件的命令是用python3,因此将其替换为python3.8
mkdir -p build pcaps logs
p4c-bm2-ss --p4v 16 --p4runtime-files build/basic.p4.p4info.txt -o build/basic.json basic.p4
sudo python3 ../../utils/run_exercise.py -t pod-topo/topology.json -j build/basic.json -b simple_switch_grpc
但替换后仍存在相同的报错
step4:检查python解释器版本一致性
为了确保 python3.8指向的确实是期望的 Python 3.8 解释器,并且能够找到mininet模块,使用sudo which python3.8
命令,发现输出的路径为:
/usr/bin/python3.8
与第一步中显示的mininet路径不同。
因此,错误产生的原因是,sudo使用系统级的python3.8解释器(路径为/usr/bin/python3.8
),但mininet安装在用户级别的路径(/home/cc/.local/lib/python3.8/site-packages
),因此当使用sudo运行python脚本时,系统无法访问用户级别路径中的mininet模块。
解决方法是在该sudo命令中加上-E
选项保留用户环境变量