Django 和 GDAL - 找不到 GDAL 库

Dar*_*iun 4 django homebrew geospatial gdal apple-m1

我有一台带有 M1 芯片的 MacBook,我正在尝试建立一个 django 项目。该项目与地理空间库 gdal 一起使用。我在版本 3.3.1_3 上和我的虚拟环境版本 3.3.1 中安装了 gdal 和 homebrew

如果我python manage.py migrate输入错误:

django.core.exceptions.ImproperlyConfigured:云找不到GDAL库(尝试过“gdal”,“GDAL”,“gdal3.1.0”,“gdal3.0.0”,“gdal2.4.0”,“gdal2.3.0”,“gdal2” .2.0”、“gdal2.1.0”)。是否安装了GDAL?如果是,请尝试在您的设置中设置 GDAL_LIBRARY_PATH。

通过 pip list 显示 GDAL 版本 3.1.0。Django 文档说不支持 3.3.x 版本,但我无法使用自制程序安装特定的 gdal 版本。

是否有不同的解决方案来启动并运行 django 项目?

小智 7

不幸的是,@Ameya 的建议对我不起作用,但他们确实让我在调查中走上了正确的道路。我的问题的根本原因与 python ctypes 有关,来自我使用的pyenv发行版,无法找到从homebrew安装的 GDAL 共享库。以下是我在调查过程中发现的一些其他解释。

\n

以下关于 python 错误的线程提供了一些关于 Apple 半新近(?)增加的导致根本问题的安全约束的良好背景和详细信息:

\n

https://bugs.python.org/issue43964

\n

pyenv 的 github 上的这篇文章提供了有关该问题的详细信息以及为什么 pyenv 没有通用解决方案:

\n

https://github.com/pyenv/pyenv/issues/2339

\n

这是一种测试您是否遇到与我相同的根本问题的方法。启动 python shell 并尝试使用 ctypes 手动加载库:

\n
\n

\xe2\x95\xb0\xe2\x94\x80\xe2\x9e\xa4 python3
\nPython 3.10.8(主要,2022 年 12 月 5 日,14:59:49)[Clang 14.0.0 (clang-1400.0.29.202)]在达尔文
\n键入“帮助”、“版权”、“制作人员”或“许可证”以获取更多信息。
\n--> from ctypes.util import find_library
\n--> find_library(\'libgdal.dylib\')

\n
\n

如果 ctypes 找到该库,则会显示路径。如果没有找到库,则不会给出任何响应。

\n

看起来 ctypes 加载器现在(?)在 macOS 上只有一组固定的路径。我使用的解决方法是简单地找到未使用的现有路径之一。然后我在那里创建了一个符号链接,指向自制程序库位置。例如,ctypes 似乎搜索 $HOME/lib 和 /usr/local/lib,这两个文件在我的计算机上都是空的(或不存在)。所以我创建了一个符号链接,如下所示:

\n
\n

\xe2\x95\xb0\xe2\x94\x80\xe2\x9e\xa4 sudo ln -s /opt/homebrew/lib /usr/local/lib

\n
\n

或者

\n
\n

\xe2\x95\xb0\xe2\x94\x80\xe2\x9e\xa4 ln -s /opt/homebrew/lib ~/lib

\n
\n

现在 ctypes 找到了该库,因此 django 可以正常启动:

\n
\n

\xe2\x95\xb0\xe2\x94\x80\xe2\x9e\xa4 python3
\nPython 3.10.8(主要,2022 年 12 月 5 日,14:59:49)[Clang 14.0.0 (clang-1400.0.29.202)]在达尔文
\n键入“帮助”、“版权”、“制作人员”或“许可证”以获取更多信息。
\n--> from ctypes.util import find_library
\n--> find_library(\'libgdal.dylib\')
\n\'/usr/local/lib/libgdal.dylib\'
\n-->

\n
\n


小智 5

我碰巧拥有新的 MacBook M1 Pro,但遇到了一些问题。以下是我为解决此问题所做的步骤。

第一步:首先检查你是否安装了gdal和geos。

gdal-config --version
Run Code Online (Sandbox Code Playgroud)

如果没有显示版本,则brew install gdal在终端中运行。

第 2 步:找出 gdal 安装路径。

which gdal-config
Run Code Online (Sandbox Code Playgroud)

如果是 M1 Mac OS,则应返回此信息 -

/opt/homebrew/opt/gdal/bin
Run Code Online (Sandbox Code Playgroud)

步骤 3:检查 gdal lib 文件是否存在于以下位置。

/opt/homebrew/opt/gdal/lib/libgdal.dylib
Run Code Online (Sandbox Code Playgroud)

如果是这样,那就太好了!如果您也需要,请对 geos 执行相同的设置。

完成所有操作后,在 Django 项目的 Settings.py 中添加以下行。

GDAL_LIBRARY_PATH = '/opt/homebrew/opt/gdal/lib/libgdal.dylib'

GEOS_LIBRARY_PATH = '/opt/homebrew/opt/geos/lib/libgeos_c.dylib'
Run Code Online (Sandbox Code Playgroud)

现在应该可以了。此外,如果您已经安装并使用 PostgreSQL,它确实附带了 GDAL 和 GEOS 库,如果需要,您也可以提供这些路径。