M1 Mac - GDAL 错误架构错误 [Django]

问题描述 投票:0回答:6

我正在尝试启动并运行一个 django 项目,该项目依赖于 GDAL 库。我正在使用基于 M1 的 mac。

按照官方 Django 文档上的说明,我已经通过brew安装了必要的软件包

$ brew install postgresql
$ brew install postgis
$ brew install gdal
$ brew install libgeoip

gdalinfo --version
运行良好并显示版本为
3.3.1

gdal-config --libs
返回此路径:
-L/opt/homebrew/Cellar/gdal/3.3.1_2/lib -lgdal

符号链接也放置在自制程序的 lib 目录中,该目录位于我的路径环境变量中。

当我尝试在不指定 gdal 库路径的情况下运行 django 时,它抱怨找不到 GDAL 包(即使该库是可访问的,因为它的符号链接可通过路径环境变量获得)。

当我尝试使用

GDAL_LIBRARY_PATH
指定 GDAL 库的路径时,出现此错误:

OSError: dlopen(/opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylib, 6): no suitable image found.  Did find:
    /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylib: mach-o, but wrong architecture
    /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.29.dylib: mach-o, but wrong architecture

P.s.我已经看过这个答案,但没有帮助。

当我尝试运行 gdalinfo 时,它运行良好,但是当 django 尝试运行时,它会抛出此错误,这不是很奇怪吗?我做错了什么?

python python-3.x django gdal apple-m1
6个回答
6
投票

GDAL 和 Python 可能是针对不同的 CPU 架构编译的。在 M1 系统上,操作系统可以运行本机 arm64 和模拟 x86_64 二进制文件。

要检查:运行

file /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylib
file $(which python3)
,这应该显示两者支持的 CPU 架构。

如果两者不匹配,您将必须重新安装其中之一。请注意,如果您重新安装 Python,您还必须重新安装所有带有 C 扩展的 Python 包。


2
投票

我偶然发现了同样的问题,在我的例子中,它是通过在settings.py中添加

GDAL_LIBRARY_PATH
来解决的,而且还
GEOS_LIBRARY_PATH

GDAL_LIBRARY_PATH = '/opt/homebrew/Cellar/gdal/3.4.1_1/lib/libgdal.dylib'
GEOS_LIBRARY_PATH = '/opt/homebrew/Cellar/geos/3.10.2/lib/libgeos_c.1.16.0.dylib'

1
投票

尝试使用新的arm版本的python!

brew install --cask miniforge
conda init zsh
conda activate
conda install numpy scipy scikit-learn

1
投票

根据 @ronald-oussoren 的见解,您必须确保 Python 和 Gdal 是从相同的架构构建的。例如,如果您使用 Python 的 conda 环境,则可以通过使用 conda 安装 gdal(因此您的项目本地可以使用 gdal)而不是自制程序来避免该问题:

conda install gdal

您无需手动设置

GDAL_LIBRARY_PATH
GEOS_LIBRARY_PATH
设置。


0
投票

如果您不需要在 M1 上本机运行它,请考虑使用 Linux 虚拟机。

我对这个问题的最终解决方案是在我的 M1 Mac 上使用 Canonical 的 Multipass 创建一个 Ubuntu VM,然后安装 postgresql、postgis 以及包括 GDAL 在内的所有相关依赖项,就像安装 Linux 一样。

https://multipass.run/

我使用以下命令来安装 postgres 和 postgis:

sudo apt-get install libpq-dev #required for psycop2-binary installation
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

sudo apt-get -y install postgresql-13 #or other version number

sudo apt install postgis postgresql-13-postgis-3

sudo -i -u postgres
createuser yourusername
createdb postgis_db -O yourusername #create your db
psql -d postgis_db
CREATE EXTENSION postgis;

#make sure these are all installed:

sudo apt-get install binutils libproj-dev 
sudo apt-get install gdal-bin
sudo apt-get install libgeos++
sudo apt-get install proj-bin

我通过 VSCode SSH 到 ubuntu 虚拟机并照常开发 django。这里有一篇关于多通道设置的好文章。

我在 M1 上的此设置没有遇到任何问题。

更新:截至 2022 年 1 月 10 日,Monterey 12.1 上的 MacOS 防火墙存在一些问题,无法与 Multipass 很好地配合。这是 GitHub 上的一个开放问题,Canonical 正在解决这个问题。

更新#2:截至 2022 年 4 月,随着 Apple 最新操作系统更新,MacOS 防火墙的多通道问题似乎已得到解决。

在 mac M1 中安装 gdal 不需要像arm 86_64这样的东西。为此需要

0
投票
。与使用

arch -x86_64 设置相比,设置非常简单。 在此处下载表格https://www.anaconda.com/download/

然后在你的M1机器上安装anaconda

1.使用python=3.8创建新环境:

conda create --name python38 python=3.8

2.活跃的环境:
conda activate python38

3.使用conda安装gdal:
conda install -c conda-forge gdal

4.使用pip安装pygdal:
pip install pygdal

确保 pygdal 和 gdal 版本相互匹配

现在使用 python38 作为需要 gdal 的解释器。

© www.soinside.com 2019 - 2024. All rights reserved.