修复 OpenCV 依赖错误的小工具:OpenCV Fixer

news/2024/10/22 7:41:38/

使用 Nvidia 官方 Docker 镜像折腾 Stable Video Diffusion 的时候,发现 OpenCV 社区有一个古怪的 issue 需要手动解决,所以顺手写了一个能够自动修复的小工具。

以及,聊聊如何快速的发布一个 Python 软件包。

写在前面

如果你在使用 Python 生态的软件时,遇到了 module 'cv2.dnn' has no attribute 'DictValue' 的报错,可以试试看这个小工具。

当然,如果你想进一步确认是因为 OpenCV 引起的问题,可以尝试执行下面的命令:

python -c "import cv2; print(cv2.__version__)"

如果你收获的不是某个版本号,而是下面的报错日志,说明你的 Python 软件包存在需要修复的问题。

Traceback (most recent call last):File "<string>", line 1, in <module>File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 181, in <module>bootstrap()File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 175, in bootstrapif __load_extra_py_code_for_module("cv2", submodule, DEBUG):File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 28, in __load_extra_py_code_for_modulepy_module = importlib.import_module(module_name)File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_modulereturn _bootstrap._gcd_import(name[level:], package, level)File "/usr/local/lib/python3.10/dist-packages/cv2/typing/__init__.py", line 168, in <module>LayerId = cv2.dnn.DictValue
AttributeError: module 'cv2.dnn' has no attribute 'DictValue'

这个问题在社区早些时候有被反馈(opencv/opencv-python #884),主要原因是在安装 numpy 时被带入一起安装的版本过旧 opencv 导致的兼容性问题。比较 Trick 的是我们并不能通过简单执行 pip install 来更新软件包,需要遵从帖子进行一些手动清理安装,才能将问题解决。

所以,我写了一个简单的开源小工具,来自动修正这个问题,项目开源地址在:soulteary/opencv-fixer。

下面讲讲如何使用这个小工具。

OpenCV Fixer

工具的使用非常简单,和使用普通的软件包一样,使用 pip install 来完成工具包的下载:

pip install opencv-fixer==0.2.5

软件的修复需要进行 OpenCV 的清理和更新下载,如果你访问 Python 官方的 PyPi 源比较慢,可以顺手更新软件源为国内的镜像:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

然后,执行下面的命令,就能够完成 OpenCV 的自动修复工作了:

python -c "from opencv_fixer import AutoFix; AutoFix()"

如果一切正常,你将看到类似下面的日志输出:

Uninstalling the following OpenCV-related packages: opencv, opencv-fixerSuccessfully uninstalled opencvSuccessfully uninstalled opencv-fixerFound opencv-python version is lower than 4.9, version=4.7.0Begin upgrade your opencv-python version to 4.9+.The folder /usr/local/lib/python3.10/dist-packages/cv2 has been removed successfully...

如果我们再次执行之前的测试命令,能够得到 OpenCV 的版本号,那么说明一切都修复正常啦:

# python -c "import cv2; print(cv2.__version__)"
4.9.0

当然,如果我们在 Docker 环境或者使用 root 用户执行,可能会收到下面的 warning 警告日志:

Install opencv-python-headless failed: WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

但其实是没有问题的,如果我们执行 pip show opencv-python-headless,能够看到软件已经被正确安装:

# pip show opencv-python-headless
Name: opencv-python-headless
Version: 4.9.0.80
Summary: Wrapper package for OpenCV python bindings.
Home-page: https://github.com/opencv/opencv-python
Author: 
Author-email: 
License: Apache 2.0
Location: /usr/local/lib/python3.10/dist-packages
Requires: numpy, numpy, numpy, numpy
Required-by: 

其他:快速发布一个 Python 软件包

想要快速发布能够被 pip install 安装的 Python 软件包,其实很简单。

首先,需要注册一个 PyPi 账号,注册完毕后,会要求我们验证邮箱有效性。再完成邮箱验证后,我们需要在账号中配置“二步认证”,从而开启获取 API Token 的权限。

获取的 API Token 页面下方,有可以一键复制的配置文件,内容类似下面这样,我们可以保存起来,稍晚使用:

[pypi]username = __token__password = pypi-一长串Token

如果你是 macOS 用户,在不配置或者更新本地 Python 环境的情况下,如果想直接发布一个软件包,可能会比较麻烦。但是如果使用 Docker 就会变的简单许多:

cd package-dirdocker run --rm -it -v `pwd`:/app python:3.10 bash

比如,使用上面的命令,可以快速的将软件包里的内容映射到 Python 3.10 容器的 /app 目录,方便我们用一个完备、干净的环境做软件发布。

发布过程中,我们可以配置软件源和完成依赖软件包的下载:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip install packaging twine

完成基础依赖后,执行下面的命令,可以将我们之前获得的 API Token 保存为可以通过 PyPi 源认证的配置文件。

cat << EOF > ~/.pypirc
[pypi]username = __token__password = pypi-一长串Token
EOF

一切就绪之后,我们执行下面的命令,完成 Python 软件包的构建和发布就完事啦:

python setup.py sdist bdist_wheel
twine upload dist/*

最后

好了,这篇文章就先写到这里。

–EOF


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年01月07日
统计字数: 3707字
阅读时间: 8分钟阅读
本文链接: https://soulteary.com/2024/01/07/fix-opencv-dependency-errors-opencv-fixer.html


http://www.ppmy.cn/news/1295654.html

相关文章

在ultralytics中实现obb检测,官方团队做了哪些修改?

在最新的在ultralytics中,官方团队已经提供了obb检测功能,并发布了相应的预训练模型,其具体使用可以参考。https://blog.csdn.net/a486259/article/details/134557389 1、网络结构 1.1 OBB(Detect) 在ultralytics\nn\modules\head.py中,实现了OBB head,用于在网络head…

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日&#xff0c;2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办&#xff0c;活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与&#xff0c;为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中&#xff0…

Vue 自定义仿word表单下拉框组件,让操作更符合用户习惯

预览时显示界面 进入编辑框时 组件代码 <template><div class "paper-select ui-select flex flex-col full-width" ><div ref"content" class"content font-s flex flex-center-cz padding-left-m padding-right-m flex-space-be…

Leetcode 3003. Maximize the Number of Partitions After Operations

Leetcode 3003. Maximize the Number of Partitions After Operations 1. 解题思路2. 代码实现 题目链接&#xff1a;10038. Maximize the Number of Partitions After Operations 1. 解题思路 这一题我看实际比赛当中只有72个人做出来&#xff0c;把我吓得够呛&#xff0c;…

CCNP课程实验-07-OSPF-Trouble-Shooting

目录 实验条件网络拓朴 环境配置开始排错错点1&#xff1a;R1-R2之间认证不匹配错误2&#xff1a;hello包的时间配置不匹配错误3&#xff1a;R2的e0/1接口区域配置不正确错误4&#xff1a;R4的e0/1接口没有配置进OSPF错误5&#xff1a;R2的区域1没有配置成特殊区域错误6&#x…

地理空间分析5——空间关联分析与Python

目录 写在开头1.空间自相关2.空间回归分析2.1 构建地理权重矩阵2.2 执行空间回归分析2.3 解释结果3 地理加权回归3.1 构建地理权重矩阵3.2 执行地理加权回归分析3.3 解释地理加权回归结果写在最后写在开头 空间关联分析是数据科学领域中一个重要的技术,尤其在地理信息系统(G…

docker运行状态

systemctl status docker Active: active (running) since 一 2024-01-08 06:21:10 CST; 3min 57s ago [rootlocalhost ~]# systemctl status docker ● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabl…

【SQL】加快SQL查询的九种优秀实践

1.只检索需要的列 对于那些所谓的数据库开发老司机而言,他们会有一个常见的SQL习惯:在编写查询代码时,频繁地使用SELECT *,一次性列出所有可能需要的数据列。显然,如果查询一个存储了一百多列的数据表的所有列,您可以想象会发生什么?毕竟在真实的系统应用环境中,这样的…