我正在尝试运行 cv2,但是当我尝试导入它时,出现以下错误:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
网上建议的解决方案是安装
apt install libgl1-mesa-glx
但这已经安装并且是最新版本。
注意:我实际上是在 Docker 上运行它,我无法检查 OpenCV 版本。我尝试导入 matplotlib 并且导入很好。
将以下行添加到您的 Dockerfile:
RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y
这些命令安装通常存在于本地机器上的 cv2 依赖项,但可能在您的 Docker 容器中丢失导致问题。
[2022 年 1 月 20 日的小更新:按照 Docker 的建议,永远不要单独放置
RUN apt-get update
,导致缓存问题]
即使上述解决方案有效。但是它们的包装尺寸很大。
libGL.so.1
由包裹libgl1
提供。所以下面的代码就足够了。
apt-get update && apt-get install libgl1
我认为这是一个更好的解决方案。包
python3-opencv
包括 OpenCV 的所有系统依赖项。
RUN apt-get update && apt-get install -y python3-opencv
RUN pip install opencv-python
尝试安装
opencv-python-headless
python 依赖项而不是 opencv-python
。这包括一个没有外部依赖项(numpy 除外)的预编译二进制轮,适用于 Docker 等无头环境。与使用 python3-opencv
Debian 软件包(及其所有依赖项)相比,这在我的 docker 映像中节省了将近 700mb。
包文档讨论了这个和相关的(更广泛的)
opencv-contrib-python-headless
pypi包。
ImportError
的例子# docker run -it python:3.9-slim bash -c "pip -q install opencv-python; python -c 'import cv2'"
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
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/lib/python3.9/site-packages/cv2/__init__.py", line 5, in <module>
from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
# docker run -it python:3.9-slim bash -c "pip -q install opencv-python-headless; python -c 'import cv2'"
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
对我来说,唯一有效的 WA 如下:
# These are for libGL.so issues
# RUN apt-get update
# RUN apt install libgl1-mesa-glx
# RUN apt-get install -y python3-opencv
# RUN pip3 install opencv-python
RUN pip3 install opencv-python-headless==4.5.3.56
如果您使用的是 CentOS、RHEL、Fedora 或其他使用
yum
的 Linux 发行版,您将需要:
sudo yum install mesa-libGL -y
就我而言,执行以下操作就足够了,与上述解决方案相比也节省了空间
RUN apt-get update && apt-get install -y --no-install-recommends \
libgl1 \
libglib2.0-0 \
把这个放在
Dockerfile
RUN apt-get update
RUN apt install -y libgl1-mesa-glx
排队前
COPY requirements.txt requirements.txt
例如
......
RUN apt-get update
RUN apt install -y libgl1-mesa-glx
COPY requirements.txt requirements.txt
......
我在 GCP Appengine Flex 服务器环境中尝试使用 OpenCV 时遇到了同样的错误。在 requirements.txt 中用“opencv-python-headless”替换“opencv-python”解决了问题。
OpenCV 文档 讨论了桌面与服务器(无头)环境的不同包。
我在 docker 容器中使用 cv2 时遇到了这个问题。我通过以下方式修复它:
pip install opencv-contrib-python
安装opencv-contrib-python而不是opencv-python.
这是您需要的解决方案:
pip install -U opencv-python
apt update && apt install -y libsm6 libxext6 ffmpeg libfontconfig1 libxrender1 libgl1-mesa-glx
在缺少各种图形库的非 gui 服务器上使用 pip3 install opencv 后,在 centos 8 上出现了同样的问题。
dnf install opencv
引入所有需要的依赖项。
“安装 opencv-python-headless 而不是 opencv-python” 这适用于我的情况! 我正在将我的网站部署到 Azure 并弹出此异常: ImportError: libGL.so.1: 无法打开共享对象文件: 没有这样的文件或目录 然后我卸载opencv-python包,安装后面的那个, 冻结需求,然后再次部署, 然后问题就解决了。
如果您使用的是 docker 或在服务器环境中,请使用
opencv-python-headless
。
对于树莓派,放这个,为我工作:
sudo apt-get install ffmpeg libsm6 libxext6 -y
对我来说,问题与代理设置有关。对于 pypi,我使用的是 pypi 的 nexus 镜像,对于 opencv 没有任何作用。直到我连接到另一个网络。
在 rocky linux 9 中,我使用命令解决了错误
dnf install mesa-libGLU
我在 Ubuntu 桌面上遇到了同样的问题,其他解决方案都不适合我。
libGL.so.1
已正确安装,但由于某种原因 Python 无法看到它:
$ ldconfig -p | grep libGL.so.1
libGL.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGL.so.1
唯一有效的解决方案是在
LD_LIBRARY_PATH
中强制使用它。在您的 ~/.bashrc
中添加以下内容,然后运行 source ~/.bashrc
或重新启动您的 shell:
export LD_LIBRARY_PATH="/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
LD_LIBRARY_PATH
不好 但对我来说这是唯一有效的解决方案。
这个命令对我有用。
apt-get install libgl1