问题描述
- 使用 pip install xxx 完成了某个包的安装,代码使用 import xxx 进行导入,但是运行出现 xxx中的某个函数或者模块不存在 类似的问题。使用 pip list 检查版本无误,摸不着头脑。
- 最直观的问题(用timm库举例):使用pip list和help timm得到的包版本不一致。
pip list结果:
help(timm)结果:
两者的版本号对不上。
根本原因是,我的项目中的timm源码文件夹和pip管理的timm冲突了。
解决方案
- 如果想留下pip list得到的版本,将help timm中FILE路径下的文件进行删除。
- 如果想留下help timm得到的版本,使用pip uninstall timm将pip管理的timm删除。
- 如果解决不了,也有可能是别的路径出现冲突,可以参照文章下文进行分析。
python导入的模块搜索顺序
python在运行时,会按照指定的路径进行包的搜索,且在搜索的过程中路径有先后之分。具体如下:
- 导入内建模块(内建模块是随着解释器一起的,不用自己管,我们只需要查看下面的顺序即可)
- 程序根目录(python当前解释的文档的目录)
- PYTHONPATH环境变量设置的目录
- 标准库的目录
- 任何能够找到的.pth文件的内容
- 第三方扩展的site-package目录
需要做的,就是看看这些路径下是否有模块冲突了。
sys.path在python脚本执行时动态生成,它返回的是一个列表,包含2-6的五个部分。在python脚本中可以加入如下代码来查看得到的路径:
import sys
print(sys.path)
参考文章
python导入的模块搜索顺序详解(python import搜寻模块的机制详解):link
为什么pip list里面的包版本和import的包版本不一致?:link