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

blmhpbnm  于 2023-03-09  发布在  Go
关注(0)|答案(5)|浏览(315)

我正在试着让一个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目录中,它在我的pathenv变量中。
当我试图运行django而不指定gdal库的路径时,它抱怨找不到GDAL包(即使库是可访问的,因为通过path env变量可以获得指向它的符号链接)。
当我尝试使用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

另外,我已经看过this answer了,但它没有帮助。
当我尝试运行gdalinfo的时候它运行的很好,但是当django尝试运行的时候它却抛出这个错误,这不是很奇怪吗?我做错了什么?

bf1o4zei

bf1o4zei1#

GDAL和Python可能是针对不同的CPU架构编译的,在M1系统上,操作系统可以运行原生的arm64和模拟的x86_64二进制文件。
要进行检查:运行file /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylibfile $(which python3),它们应该显示两者支持的CPU体系结构。
如果两者不匹配,你必须重新安装其中一个。注意,如果你重新安装Python,你也必须重新安装所有带有C扩展名的Python包。

zqry0prt

zqry0prt2#

我遇到了同样的问题,在我的情况下,通过在www.example.com中添加GDAL_LIBRARY_PATH解决settings.py,但也添加了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'
qltillow

qltillow3#

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

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

06odsfpq4#

如果您不需要在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到ubuntuVM,并像往常一样开发django。有一篇关于多通道设置here.的文章
我在M1上使用此设置时没有遇到任何问题。
更新:截至2022年10月1日,Monterey 12.1上的MacOS防火墙出现了一些问题,无法很好地使用Multipass。这是一个open issue on GitHub,Canonical正在解决它。
更新#2:截至2022年4月,在苹果最新的操作系统更新之后,MacOS防火墙的多通道问题似乎得到了解决。

6yjfywim

6yjfywim5#

根据@ronald-oussoren的见解,你必须确保Python和Gdal是从相同的架构构建的,例如,如果你使用的是conda环境,你可以通过安装带有conda的gdal(这样你就可以在你的项目本地使用gdal)而不是homebrew来避免这个问题:

conda install gdal

而且您不需要手动设置GDAL_LIBRARY_PATHGEOS_LIBRARY_PATH设置。

相关问题