pip freeze无法显示已安装OpenCV包,却可正常导入问题求助
解决OpenCV可导入但pip freeze无法检测到的问题
我之前也碰到过完全一样的情况!你遇到的这个问题核心原因很明确:你是通过源码编译安装的OpenCV,而非使用pip工具安装——pip freeze只能追踪通过pip安装的包,源码编译后直接放到Python库目录的包不会被pip的包管理系统记录,所以自然搜不到。
先确认你的情况:从你给出的cv2.__file__路径/usr/local/lib/python3.6/dist-packages/cv2.cpython-36m-x86_64-linux-gnu.so来看,确实是编译后手动部署到dist-packages目录的,完全符合这个场景。
下面给你两个可行的解决方案:
方案一:手动给OpenCV添加pip识别的元信息
如果不想重新安装,只想让pip freeze能显示这个包,可以手动创建pip识别的元数据目录:
- 进入OpenCV所在的Python库目录:
cd /usr/local/lib/python3.6/dist-packages - 创建对应版本的dist-info目录:
sudo mkdir opencv_python-3.4.2.dist-info - 进入该目录,创建
METADATA文件并写入基础信息:
写入以下内容(可根据实际情况调整):sudo nano opencv_python-3.4.2.dist-info/METADATAMetadata-Version: 2.1 Name: opencv-python Version: 3.4.2 Summary: OpenCV Python bindings Home-page: https://opencv.org/ Author: OpenCV Development Team License: BSD-3-Clause - 再创建
INSTALLER文件,标注安装来源:
完成后再执行echo "source" | sudo tee opencv_python-3.4.2.dist-info/INSTALLERpip freeze | grep opencv就能看到opencv-python==3.4.2了。
方案二:改用pip安装对应版本的OpenCV
如果想彻底解决包管理的问题,建议卸载当前源码编译的版本,改用pip安装:
- 删除现有的OpenCV文件:
sudo rm -rf /usr/local/lib/python3.6/dist-packages/cv2* - 安装对应3.4.2版本的opencv-python:
安装完成后,pip install opencv-python==3.4.2pip freeze就能正常显示这个包,后续升级或卸载也能直接用pip操作,更省心。
补充说明
Python能导入cv2是因为它在/usr/local/lib/python3.6/dist-packages这个目录下——这是Python默认的第三方库搜索路径之一,所以不管是不是pip安装的,只要在这个路径里,Python都能找到。但pip的包管理只记录自己安装的包,这就是为什么会出现“能导入但pip freeze看不到”的矛盾情况。
内容的提问来源于stack exchange,提问作者mrgloom




