我正在试着让一个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尝试运行的时候它却抛出这个错误,这不是很奇怪吗?我做错了什么?
5条答案
按热度按时间bf1o4zei1#
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包。
zqry0prt2#
我遇到了同样的问题,在我的情况下,通过在www.example.com中添加
GDAL_LIBRARY_PATH
解决settings.py,但也添加了GEOS_LIBRARY_PATH
qltillow3#
尝试使用新的arm版本的python!
06odsfpq4#
如果您不需要在M1上本机运行,请考虑使用Linux虚拟机。
我对这个问题的最终解决方案是在我的M1 Mac上使用Canonical的Multipass创建一个Ubuntu VM,然后安装postgresql、postgis和所有相关的依赖项,包括GDAL,就像在Linux上一样。
https://multipass.run/
我使用以下代码来安装postgres和postgis:
我通过VSCode SSH到ubuntuVM,并像往常一样开发django。有一篇关于多通道设置here.的文章
我在M1上使用此设置时没有遇到任何问题。
更新:截至2022年10月1日,Monterey 12.1上的MacOS防火墙出现了一些问题,无法很好地使用Multipass。这是一个open issue on GitHub,Canonical正在解决它。
更新#2:截至2022年4月,在苹果最新的操作系统更新之后,MacOS防火墙的多通道问题似乎得到了解决。
6yjfywim5#
根据@ronald-oussoren的见解,你必须确保Python和Gdal是从相同的架构构建的,例如,如果你使用的是conda环境,你可以通过安装带有conda的gdal(这样你就可以在你的项目本地使用gdal)而不是homebrew来避免这个问题:
而且您不需要手动设置
GDAL_LIBRARY_PATH
或GEOS_LIBRARY_PATH
设置。