Python模块导入报错这事,跟哄女朋友真没区别。你越急着讲道理,系统越不理你。报错信息甩脸上,你第一反应不该是去查“为什么错”,而是该看看“环境对不对”。
先看Python解释器版本。你辛辛苦装了个模块,结果发现用的是系统自带的Python 2。这事我干过不只一次。打开命令行敲python --version,看清了再往下走。版本对不上就老老实实改环境变量,或者直接进虚拟环境干活。
虚拟环境是救星,但也是坑。我见过有人开了虚拟环境,却忘激活就开始装包。装半天装不上,急得想砸电脑。解决办法就一条:检查终端里有没有显示环境名称。没显示就得source venv/bin/activate。这一步做了,后面少哭一半。
再说个常见的:本地能跑,部署到服务器就报错。别慌,大概率是服务器上没装你本地的那些包。老老实实导出requirements.txt,再对着刷一遍。别偷懒,服务器环境和本地一模一样才安全。
还有种情况,包装上了但版本不对。你项目里用的是pandas 1.3.0,环境里装的是2.0.0。一到import就挂。解决办法是锁定版本号,别用最新版当默认。实在懒得记版本就pip freeze看一遍,一目了然。
路径问题也尴尬。你写了个from mymodule import something,结果文件放错目录。Python找不着就报ModuleNotFoundError。这种时候别死磕,直接print(sys.path)看搜索路径。发现缺了目录就把路径加上,或者把文件挪到正确位置。
有些问题藏得深。比如你动了系统Python,装了跟项目冲突的包。或者你开了多个虚拟环境,切换到另一个环境后忘记切换回来。这时候最好的办法是:删掉所有环境,从零开始搭。别舍不得,环境乱套了重新搭比找bug快得多。
遇到循环导入,那就是代码设计问题。你A模块引了B,B又引了A。两者互相等着初始化。解决办法就一个:拆分模块。把公用的函数抽出来放到C模块里去,让A和B都引C。不绕弯子,不搞花活。
还有镜像源的事。pip默认源在国外,网络一卡就超时。你装个包等半天,最后报TimeoutError。换成国内清华源或者阿里源,问题秒解。敲命令pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名,别再用默认源跟自己过不去。
写到最后你会发现,模块导入报错跟女朋友生气一样。你问她为什么生气,她不会直接告诉你。你得自己去捋:是不是哪里没做对,是不是哪个环节疏忽了。环境捋顺了,问题自然就没了。别跟电脑讲道理,它只认你做了什么操作。
对了,记得养成习惯:每次写新项目都先建虚拟环境,然后装依赖。这样再也不会在半夜被模块报错气到失眠。