django.core.exceptions.ImproperlyConfigured:找不到 GDAL 库 - m1 mac

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

我正在尝试在 m1 mac 上为我的 django 应用程序创建一个 Pyinstaller。

当我运行 ./build.sh 时,其中包含

source .env/bin/activate
pyinstaller backend/manage.py -F \
--name "test" \
--icon='icon.ico' \
--add-data "backend/*:package" \

我收到以下错误

144 WARNING: Failed to collect submodules for 'django.contrib.gis.utils' because 

importing 'django.contrib.gis.utils' raised: django.core.exceptions.ImproperlyConfigured: 

Could not find the GDAL library (tried "gdal", "GDAL", "gdal3.4.0", "gdal3.3.0", 

"gdal3.2.0", "gdal3.1.0", "gdal3.0.0", "gdal2.4.0", "gdal2.3.0", "gdal2.2.0"). Is GDAL 

installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.

在我的settings.py中我有

GDAL_LIBRARY_PATH = "/opt/homebrew/Cellar/gdal/3.5.2/lib/libgdal.dylib"
GEOS_LIBRARY_PATH = "/opt/homebrew/Cellar/geos/3.11.0/libgeos_c.1.17.0.dylib"

终端中的AMD

/opt/homebrew/opt/geos/lib/libgeos_c.dylib: Mach-O 64-bit dynamically linked shared library arm64
/opt/homebrew/Cellar/gdal/3.5.2/lib/libgdal.dylib: Mach-O 64-bit dynamically linked shared library arm64
python django pyinstaller apple-m1
2个回答
3
投票

如果您使用的是 MAC 并使用 Anaconda 那么
第1步:

conda install -c conda-forge gdal

第 2 步:将其设置在您的
Settings.py

GDAL_LIBRARY_PATH='/opt/anaconda3/lib/libgdal.dylib'
GEOS_LIBRARY_PATH='/opt/anaconda3/lib/libgeos_c.dylib'

(这对我有用)


0
投票

设置 Django 的

GDAL_LIBRARY_PATH
以及所有 Diki Bhuyan 的 answer 确实有帮助。对于那些因为苹果芯片上随机工作/失败而发疯的人来说,还有一些更多的细节:

  1. Homebrew 安装的 Python 在搜索库时包含 Homebrew

    /opt/homebrew/lib
    目录,因此也会找到 Homebrew 安装的 GDAL:

    /opt/homebrew/bin/python3 -c 'import ctypes.util; print(ctypes.util.find_library("gdal"))'
    /opt/homebrew/lib/libgdal.dylib
    
  2. 但是,Pyenv 安装的 Python 不会:

    PYENV_VERSION=3.13 pyenv exec python -c 'import ctypes.util; print(ctypes.util.find_library("gdal"))'
    None
    

    单步执行代码显示以上内容仅搜索:

    • ~/lib/
    • /usr/local/lib/
      (最新版本的 macOS 上没有此类文件夹)
    • /lib/
      (同样)
    • /usr/lib/

因此,例如,当使用 Homebrew 安装的 Python 使用

python -m venv venv
创建虚拟环境时,事情可能会神奇地工作,或者在使用另一个 Python 时失败。

除此之外,人们可能希望在

settings.py
中使用以下内容,而不是对路径进行硬编码,就像 Cookiecutter Django 中使用的

# Assuming `src/project/settings.py` BASE_DIR = Path(__file__).resolve(strict=True).parent.parent.parent READ_DOT_ENV_FILE = env.bool("DJANGO_READ_DOT_ENV_FILE", default=False) if READ_DOT_ENV_FILE: # OS environment variables take precedence over variables from .env env.read_env(str(BASE_DIR / ".env"))
同时,在同一个文件中或仅用于本地测试的文件中:

GDAL_LIBRARY_PATH = env("GDAL_LIBRARY_PATH", default="") GEOS_LIBRARY_PATH = env("GEOS_LIBRARY_PATH", default="")
还有一个 

.env

 文件,例如:

# This needs `export DJANGO_READ_DOT_ENV_FILE=True` # Make any Python find Homebrew-installed GDAL, with paths as per # `gdal-config --prefix` and `geos-config --prefix` GDAL_LIBRARY_PATH=/opt/homebrew/opt/gdal/lib/libgdal.dylib GEOS_LIBRARY_PATH=/opt/homebrew/opt/geos/lib/libgeos_c.dylib
最后为了将来的搜索,当不设置

GEOS_LIBRARY_PATH

时,
DATABASES["default"]["ENGINE"] = "django.contrib.gis.db.backends.postgis"
会抛出:

django.core.exceptions.ImproperlyConfigured:“django.contrib.gis.db.backends.postgis”不是可用的数据库后端或无法导入。

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