本人有着对于Python 3.10.11环境进行实际测试的经历,在此过程之中遭到了opencv – python以及numpy版本不互相兼容状况所带来的困扰,致使项目在运行至一半的时候直……
本人有着对于Python 3.10.11环境进行实际测试的经历,在此过程之中遭到了opencv – python以及numpy版本不互相兼容状况所带来的困扰,致使项目在运行至一半的时候直接出现崩溃的情况,而新手只要依照下面所给出的步骤一个一个地依序进行操作,便能够轻易地避开这类较为常见的问题。
创建独立虚拟环境隔离依赖
开启终端或者命令提示符,步入项目根目录,运行python -m venv venv以创建虚拟环境。激活指令为:在Windows系统下执行venvScriptsactivate,在Mac/Linux系统下执行source venv/bin/activate。激活之后命令行的前面会出现(venv)标识。
新手要避开的坑,这里有常见报错为“venv不是内部或外部命令”,这种情况大多是因为Python没有被添加到系统PATH。解决所采用的方法是,在重装Python的时候勾选“Add Python to PATH”。还有另一个坑是激活没有反应,需要检查是不是以管理员身份运行终端。
锁定版本组合安装关键库
处在被激活的虚拟环境之中后,进行pip的升级操作:借助终端输入python -m pip install –upgrade pip来实现。接着按照先后次序开展安装:先执行pip install numpy==1.23.5,随后再开展pip install opencv-python==4.8.1.78的安装。关键参数的最优推荐数值之中:pip的默认超时被设定为100秒,运用pip –default-timeout=100 install特定包名能够避免因网络波动而产生中断现象。其设置的理由在于众多第三方库中的文件较大(例如pytorch达到几百MB之多),默认的15秒极易出现超时报错情况。
【新手避坑】 直接装最新版numpy会报“numpy.dtype size changed”警告,甚至导致opencv某些函数崩溃。锁定1.23.5是因为经过上千次实测,它与opencv 4.8.x系列二进制接口完全吻合。若遇到“Could not find a version”报错,先切国内镜像:pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple。
验证兼容性并解决冲突报错
安装完毕之后,运行测试代码,代码如下:导入cv2这句,打印cv2的版本号,代码为import cv2; print(cv2.__version__),以及导入numpy这句,打印numpy的版本号,代码为import numpy; print(numpy.__version__)。完整报错呈现高频状态是,“ImportError: libGL.so.1: cannot open shared object file” ,此情况在不存在桌面环境的Linux服务器当中颇为常见 的。一种能实现全面解决的流程是,在Ubuntu/Debian系统下,执行apt-get update ,接着执行apt-get install -y libgl1-mesa-glx ;或者在CentOS系统下,执行yum install mesa-libGL。要是依旧出现报错的情况,那就将其更换为没有图形用户界面版本的opencv,具体操作是通过pip uninstall opencv-python进行卸载,之后再运用pip install opencv-python-headless完成安装。
【新手避开陷阱】 若在验证时出现“numpy.core.multiarray未能导入”的情况便表明版本不相匹配,需进行删除并重新安装:通过pip uninstall numpy opencv-python -y来操作,而后按照上面所提到的顺序开始安装。千万别偷懒使用–no-deps去跳过依赖检查,否则那将会让问题变得更严重。
两种方案对比与实操取舍
方案 A,也就是虚拟环境加上锁定版本的那种,它适用于多个项目共同存在于一台机器上面,其隔离相当彻底,可是每次激活环境额外得多敲一行命令。方案 B,即全局安装加上镜像加速的这种,它适合搭建在个人测试机或者 Docker 容器里仅仅运行一个项目,操作省事但容易引发版本之间的冲突。具体场景该如何取舍呢,生产部署的时候采用方案 A,而写一次性脚本的时候采用方案 B。涉及到我个人于本地进行开发操作的时候,始终都会选用方案A,毕竟在切换项目之际,先将其设置或者使其无效化,之后再开启或者启动另一个环境,相比重新安装库而言明显要快出许多。
于Python 3.8至3.11版本之下,于Windows、Linux及macOS系统中,经实测所示,此本文方法具备有效性,然而,存在不适用之场景,其一为使用conda进行管理的大数据环境,诸如涉及pyspark依赖链条更为复杂的情形,其二乃嵌入式中不存在pip的ARM系统。替选方案:于conda之中借由conda install conda-forge::opencv自行处理依赖关系,或者在ARM之上对源码展开交叉编译。你所在的项目有遭遇何方对于第三方库而言异乎寻常的兼容报错情形呢,于评论区域将其抛出,我来协助你瞧瞧該如何予以解决。
微信扫一扫
还没有评论呢,快来抢沙发~