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

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

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

写在前面

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

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

bash 复制代码
python -c "import cv2; print(cv2.__version__)"

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

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 bootstrap
    if __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_module
    py_module = importlib.import_module(module_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _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 来完成工具包的下载:

bash 复制代码
pip install opencv-fixer==0.2.5

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

bash 复制代码
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

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

bash 复制代码
python -c "from opencv_fixer import AutoFix; AutoFix()"

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

bash 复制代码
Uninstalling the following OpenCV-related packages: opencv, opencv-fixer

Successfully uninstalled opencv

Successfully uninstalled opencv-fixer

Found opencv-python version is lower than 4.9, version=4.7.0

Begin upgrade your opencv-python version to 4.9+.

The folder /usr/local/lib/python3.10/dist-packages/cv2 has been removed successfully

...

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

bash 复制代码
# python -c "import cv2; print(cv2.__version__)"
4.9.0

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

bash 复制代码
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,能够看到软件已经被正确安装:

bash 复制代码
# 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 页面下方,有可以一键复制的配置文件,内容类似下面这样,我们可以保存起来,稍晚使用:

Toml 复制代码
[pypi]
  username = __token__
  password = pypi-一长串Token

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

bash 复制代码
cd package-dir

docker run --rm -it -v `pwd`:/app python:3.10 bash

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

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

bash 复制代码
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install packaging twine

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

bash 复制代码
cat << EOF > ~/.pypirc
[pypi]
  username = __token__
  password = pypi-一长串Token
EOF

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

bash 复制代码
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

相关推荐
小兔崽子去哪了7 分钟前
RFM 模型 项目实战
python
Likeadust18 分钟前
视频直播点播平台EasyDSS助力企业打造全场景数字化宣传体系
运维·人工智能·音视频
昨天那个谁谁19 分钟前
ROS2运行时报无法加载create_key等符号错误
c++·python·ros2
韩曙亮33 分钟前
【AI 大模型】LangChain 框架 ① ( LangChain 简介 | LangChain 模块 | LangChain 文档 )
人工智能·ai·langchain·llm·大语言模型·prompts·agents
码农阿豪34 分钟前
本地 AI 模型随心用!Cherry Studio + cpolar解锁跨设备智能办公
人工智能
通义灵码43 分钟前
用 Qoder 加速前端巨石应用的架构演进
前端·人工智能·架构·qoder
一水鉴天1 小时前
整体设计 定稿 之21 拼语言表述体系之3 dashboard.html V5(codebuddy)
前端·人工智能·架构
nju_spy1 小时前
python 算法题基础常用总结(比赛 or 机试 or 面试)
python·记忆化搜索·位运算·二分查找 - bisect·排序与lambda·最短路和最小生成树·堆与优先队列
Deng8723473481 小时前
自动化极验3点选验证码的识别与验证方案
运维·python·自动化
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2025-12-01
大数据·人工智能·经验分享·搜索引擎·产品运营