关于《ModuleNotFoundError:No module named xx》问题的本质原因探究

作为一个触坑快一年的蒻鸡,从ubantu liunx到win10 vscode/pycharm的环境,从嵌入式ros到深度学习、机器学习 ... 曾几何时,意气风发的菜鸡,立志学好xx技术,于是开始跑别人源码,或是为了复现,或是为了细细研读,从而更深入理解理论。然而在跑程序的时候, 往往卡在第一步“导包” ...QAQ。每当遇到跑的时候弹出的错误时,总是习惯性的Ctrl c/v +百度来解决,当然有的时候似乎很快能解决:例如简单的pip install xx。然而,这样放弃思考问题原因的方式,不总是那么有效的。总会有天,会发现无论怎么搜解决方案,总是不能解决导包的问题。往往一个最简单的事,却被困扰的最长时间,最炸裂的是,电脑前坐一天,尝试了几乎所有网上的解决方案,根本不知道原因在哪儿。

下面我们将细细讲一下关于 导包 所引起的问题,分析其前因后果。

适用情况:

本文主要讨论的环境是在 win10+anaconda+python3.7.x+vscode;

lliunx环境可参考:https://blog.csdn.net/cc1949/article/details/78285842

适用的问题包括但不限于:No module named xx;ImportError: cannot import name 'XXXX';python import模块报错;

本文着重解决的是通用性的问题,一些由特殊原因导致的错误,不在本文讨论范围

第一部分:pip install 与conda install 

1.pip 与conda 是什么?

conda是一种通用包管理系统,是想要构建和管理任何语言的任何类型的软件。因此,它也适用于Python包。

pip是Python的官方的包管理器,最常用于安装在Python包索引(PyPI)上发布的包。PyPI网址:https://pypi.python.org/pypi  可以在这上面查询是否有自己需要的python包

pip是Python包的通用管理器; conda是一个与语言无关的跨平台环境管理器。

更多操作的区别,详见:https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands

by the way,我发现刚开始入坑的同学真的不喜欢看官方文档,网上照抄文档的解答方案竟会有那么多赞?其实很多问题在文档中会有提及和描述。

区别与联系:

补充与说明:

pip安装不会安装所有的依赖项只会安装部分依赖项,而conda会安装全部;
pip与conda不会重复安装已经安装的依赖;
pip安装的内容不会显示在anaconda navigation的环境中,conda会;
 

2.pip install 与conda install 做了什么?

当然,我们都知道他们可以安装包。但是更细节的呢?

(1)安装包的所在文件夹位置不同(这个问题很多高赞的文章其实表述的不完整,我也是在跑程序的时候发现的)

地址不同,意味着在import时候,搜索的地址是不同的。因此,在对各类包版本管理的时候要注意

使用conda install时,不论python选择conda中的啥环境,总有默认安装地址为:E:\anaconda\pkgs   (E盘是安装anaconda的位置)。因此我们可以默认为conda install就是在总环境下安装安装包,各类子环境可以通用其安装包。

使用pip install时,就要分情况讨论了

如果在配置vscode时选择的python编译器是来自地址:E:\anaconda\python.exe   也就是说,它是来自conda(base)环境,在vscode中选择编译环境是如图所示。

那么这个时候,pip install的安装位置是在:E:\anaconda\Lib\site-packages

如果在配置vscode时选择的python编译器是来自地址:E:\anaconda\python.exe   也就是来自conda的子环境,在vscode中选择编译环境是如图所示。

那么这个时候,pip install的安装位置是在:E:\anaconda\envs\tensorflow2\Lib\site-packages

 

(2)安装包在文件夹中的 格式 的区别

安装包存在的格式,举例pip/conda install numpy

使用的pip install在  \Lib\site-packages  文件夹下:

通常包含两个文件的格式,两个文件都有用

使用的conda install在  \pkgs  文件夹下:

通常包含多个文件的格式,但只有最新版本的那个文件有用,其余都是可以删除

 

第二部分:版本不匹配问题

包与包之间的版本不匹配问题,可能会导致,你明明已经安装了某安装包,却还是会导包报错;

又或者明明已经pip 安装了相应对应版本,却还是导包报错,为什么呢?

1.conda list与pip list

区别:

Conda 除了虚拟环境下的还有关联文件下;Pip只有当前虚拟环境下
当关联环境下有这个包,再用conda在其他虚拟环境下,下载该包就会直接关联,不用下载

比如说base环境下有包,在另一个环境下下载同样的包,就会关联上,不用真的下载,直接复制过去或者关联即可
pip下的list是conda下list的子集

 

conda list 列出的所有安装包信息检索范围为:E:\anaconda\pkgs + 对应环境下\Lib\site-packages 中的所有安装包信息(不包含重复,并且列出的安装包并非是最新版本)

输入conda list后,截取的部分内容:

其中,注意到红框部分,表示conda在该环境下的关联的pip包。也就是来自对应环境下\Lib\site-packages中的包。请注意,这里的 torch 版本是1.7.1,稍后我们将对比pip list中的torch版本

pip list 列出的所有安装包信息检索范围为: 对应环境下\Lib\site-packages 中的所有安装包信息

输入pip list后,截取的部分内容:

注意到红框部分torch版本为1.8.1,

为什么conda list 与pip list 下的某些安装包版本会不一样呢?

在import torch的时候系统会import哪个版本呢?

 

2.版本不一致问题

接上问题,我们展开讨论

为什么conda list 与pip list 下的某些安装包版本会不一样呢?

由上图可知,conda中的torch版本是来自pip的安装目录,因此我们打开当前环境的pip安装目录,即 对应环境下\Lib\site-packages

欸,发现torch是1.8.1版本,与pip list对应。那conda list中的torch 1.7.1是哪儿来的呢?——这个目前我也不知道了 ......~_~

欸,我想起来,我曾经手动删除了来自  对应环境下\Lib\site-packages 环境下的torch 1.7.1 版本。可能这是没用命令行删除的原因。即便不是这样,还是会遇到conda lisst 与 pip list版本不一致问题

遇到版本不一致时,一定要明确系统到底import哪个版本。

 

在import torch的时候系统会import哪个版本呢?

输入:

import torch
print(torch.__version__)  #注意是双下划线

得到:

1.8.1+cpu

说明此时,系统import的是1.8.1+cpu版本的torch。

那么在安装新包的时候一定要注意安装包与安装包的版本依赖问题

如果两个依赖安装包版本不对应的话,系统可能就会报No module named xx;ImportError: cannot import name 'XXXX';python import模块报错;

比如torch与torchtext的版本对应问题,

可以在 https://github.com/pytorch/text 查看。其他的版本问题同样可以在github中搜到项目官方文档,里面一般会给出依赖版本。

可以手动删除或添加对应安装包,前提是符合文件格式(上文讨论过),也可以pip conda操作

 

第三部分:其他

遇到其他不能解决的问题,可以去github官方文档提issue或者在issue中查找你出现的问题;

不到万不得已,不要随便删除环境,重新安装所有包;

在stackoverflow 中查相关问题 ,准确很多

 

希望本文能帮到正在被各类导包问题折磨的你

如果还有相关问题,请在评论区讨论,随缘回复~

本人过于蒻 ~

文中若有错误,请大佬在评论区不吝赐教~  定及时改正!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当出现"ModuleNotFoundError: No module named 'PIL'"错误时,表示Python程序中调用了一个名为PIL的模块,但是该模块并没有被正确安装。这个错误通常是由于缺少所需的库或包导致的。 解决这个问题的方法是安装PIL模块,你可以按照以下步骤进行操作: 1. 使用命令行或终端打开Python的包管理工具(如pip)。 2. 运行以下命令来安装PIL模块:pip install Pillow 3. 如果你使用的是旧版本的Python(如Python 2.x),则需要运行以下命令来安装PIL模块:pip install PIL 4. 等待安装完成后,重新运行你的程序。 通过这些步骤,你应该能够解决"ModuleNotFoundError: No module named 'PIL'"错误,并且成功导入PIL模块。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [已解决ModuleNotFoundError: No module named ‘PIL](https://blog.csdn.net/yuan2019035055/article/details/126322206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python pyautogui模块实现鼠标键盘自动化方法详解](https://download.csdn.net/download/weixin_38547887/14849946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值