最近碰到一个问题,起因是我在训练的时候。提示:
ModuleNotFoundError: No module named 'cv2' 没有找到对应模块问题。
后面运行命令:
pip show opencv-python
pip show opencv-python
Name: opencv-python
Version: 4.1.2.30
Summary: Wrapper package for OpenCV python bindings.
Home-page: https://github.com/skvark/opencv-python
Author:
Author-email:
License: MIT
Location: /home/cgq/.local/lib/python3.8/site-packages
Requires: numpy
Required-by:
又有对应的依赖版本信息。
之后我检测了另外一个服务器环境:
运行命令
which python 检测python环境
which pip 检测pip环境
which conda 检测conda环境
可以看到,服务器conda环境路径没什么问题。
后面我检查了一下pip环境的路径,和conda环境的路径。
(deeplab) cgq@xmlg:~/.conda/envs/deeplab/bin$ which pip
/home/cgq/.local/bin/pip
(deeplab) cgq@xmlg:~/.conda/envs/deeplab/bin$ which conda
/home/xmlg/miniconda3/condabin/conda
发现两个环境的路径不在同一个地方。 因为服务器是有很多个人用,pip配置的环境为全局环境,而conda配置的环境是我们自己的环境。 这就导致,我们在运行命令: pip install xxx package 包的时候,依赖包会安装在全局环境下,没办法导入我们自己的项目环境。
目录
发现问题之后,就有解决思路了。
方法1:
1. 强制使用虚拟环境中的 pip
手动使用虚拟环境的 pip
:
在 Conda 虚拟环境中,虚拟环境的 pip
应该位于 ~/.conda/envs/deeplab/bin/
目录下。你可以手动调用这个路径下的 pip
,如下所示:
~/.conda/envs/deeplab/bin/pip install opencv-python
这样就确保你使用的是 deeplab
环境下的 pip
,而不是全局的 pip
。
验证路径:
再次验证虚拟环境中 pip
和 python
的路径是否一致:
which python
which pip
两者都应该指向 ~/.conda/envs/deeplab/bin/
目录。如果 pip
还指向错误的位置,你可能需要修改系统的 PATH 变量。
方法2:
2. 更新环境的优先级
有时,全局的 pip
会覆盖掉 conda
环境的 pip
。为了解决这个问题,你可以尝试以下几步:
1. 检查 PATH 变量顺序
运行以下命令检查当前的 PATH 变量:
echo $PATH
确保 ~/.conda/envs/deeplab/bin
目录排在前面。如果不是,可以手动将该路径添加到 PATH 变量的前面:
export PATH=~/.conda/envs/deeplab/bin:$PATH
然后再运行 which pip
看是否有变化。
2. 重新安装 pip
到正确的路径
你可以使用 Conda 自带的 pip
包来确保安装在虚拟环境中:
conda install pip
然后再检查 which pip
看路径是否正确。如果依然无效,继续下一步。
方法3:
3. 清除用户全局的 pip
如果你不打算使用全局的 pip
,可以删除全局的 pip
安装,从而让 conda
虚拟环境的 pip
默认生效。
rm -rf ~/.local/bin/pip
这会删除当前用户的全局 pip
,然后使用 conda
环境中自带的 pip
。
注意:如果你是实验室公共的服务器,最好不要这么做
4. 重建虚拟环境
如果问题仍然存在,建议你重建虚拟环境,以确保没有残留的错误配置:
conda remove -n deeplab --all
conda create -n deeplab python=3.8
conda activate deeplab
conda install pip
这会重新创建并配置一个干净的环境。
总结这个问题主要是全局 pip
和 conda
环境的 pip
冲突。你可以通过手动指定虚拟环境的 pip
路径,或者调整 PATH 变量,确保 conda
的 pip
在系统中优先。当然,这个问题,对于许多初学者或者刚接触,会容易无从下手。关键在于发现问题的原因,因为这比解决问题更加重要!!!