我正在尝试在 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
如果您使用的是 MAC 并使用 Anaconda 那么
第1步:
conda install -c conda-forge gdal
Settings.py
GDAL_LIBRARY_PATH='/opt/anaconda3/lib/libgdal.dylib'
GEOS_LIBRARY_PATH='/opt/anaconda3/lib/libgeos_c.dylib'
(这对我有用)
设置 Django 的
GDAL_LIBRARY_PATH
以及所有 Diki Bhuyan 的 answer 确实有帮助。对于那些因为苹果芯片上随机工作/失败而发疯的人来说,还有一些更多的细节:
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
但是,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”不是可用的数据库后端或无法导入。