Windows上的GeoDjango:"找不到GDAL库" /" OSError:[WinError 126]无法找到指定的模块"

时间:2018-03-06 20:00:45

标签: python django postgresql postgis geodjango

我一直在尝试设置我的Windows计算机,以便我可以拥有一个带PostGIS扩展名的本地postgreSQL。有了这个安装,我希望能够在将它放入云之前在本地创建一个geodjango项目。我一直在使用SQLite DB在我的本地机器上使用Django一段时间,但由于下一个项目将部分基于基于坐标的数据,我想设置正确的环境。

导入说明:我已安装mini-conda以在单独的环境中运行。我确实激活了这个环境" development"当我工作时

我曾尝试在线跟踪大部分geodjango信息/教程,但无法使其发挥作用。我做过的事情(大部分都是这样的:https://docs.djangoproject.com/en/2.0/ref/contrib/gis/install/#windows):

  1. https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
  2. 下载并安装最新的(10.3)PostgreSQL设置
  3. 安装后我还安装了使用Application Stack Builder来安装PostGis
  4. 我已经从https://trac.osgeo.org/osgeo4w/
  5. 安装了OSGeo4W
  6. 我已经创建了一个批处理脚本,如geodjango网站(https://docs.djangoproject.com/en/2.0/ref/contrib/gis/install/#windows)所述并以管理员身份运行(除了设置python路径的部分,因为python已经在那里了我现在已经使用python一段时间了)
  7. 我在psql shell中尝试了一些命令,我​​想我已创建了一个名为geodjango的数据库,用户名:****并传递:****。
  8. 我不知道我是否给了geodjango用户所有权利,但我怀疑是这样。
  9. 在完成所有这些后,我创建了一个新的django项目,在settings.py中我添加了一些部分:

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'nameOfMyApp',
    ]
    

    我也在settings.py中找到了这个:

    DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'geodjango',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': 'localhost',
    }
    }
    
    # FOR GEODJANGO
    POSTGIS_VERSION = (2, 4, 3)
    

    当我尝试在django中设置数据库时,我运行(在右侧文件夹中):

    python manage.py makemigrations
    

    我收到以下错误:

    django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal202", "gdal201", "gdal20", "gdal111", "gdal110", "gdal19"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.
    

    我试图解决这个问题,但似乎没有任何效果。 任何人都可以帮我在本地设置这一切吗?

    更新7-3-2018:

    现在我收到以下错误:

    OSError: [WinError 126] The specified module could not be found
    

    (而.dll就在那里......)

10 个答案:

答案 0 :(得分:22)

我发现以下内容适用于Windows:

  • 运行python以检查 python 是32位还是64位。
  • 将相应的OSGeo4W(32或64位)安装到C:\OSGeo4WC:\OSGeo4W64
    • 注意:选择“快速Web-GIS安装”,然后单击“下一步”。
    • 在“选择包”列表中,确保选中GDAL;默认情况下也会启用MapServer和Apache,可以安全地取消选中。
  • 确保settings.py中包含以下内容:

    import os
    if os.name == 'nt':
        import platform
        OSGEO4W = r"C:\OSGeo4W"
        if '64' in platform.architecture()[0]:
            OSGEO4W += "64"
        assert os.path.isdir(OSGEO4W), "Directory does not exist: " + OSGEO4W
        os.environ['OSGEO4W_ROOT'] = OSGEO4W
        os.environ['GDAL_DATA'] = OSGEO4W + r"\share\gdal"
        os.environ['PROJ_LIB'] = OSGEO4W + r"\share\proj"
        os.environ['PATH'] = OSGEO4W + r"\bin;" + os.environ['PATH']
    
  • 运行python manage.py check以验证geodjango是否正常运行。

答案 1 :(得分:9)

在Windows 10 Pro计算机上更新了一些OSGEO4W之后,我又开始遇到GDAL绑定问题。我以前曾结合使用此处和this tutorial中发布的解决方案。

这是使用Windows 10 Pro 64位,Django 3.0.6和GDAL 3.0.4(使用python 3.7虚拟环境)对我有效的方法。我已经在没有OSGEO4W的情况下对其进行了测试,它似乎可以正常工作。

首先,从Christoph Gohlke's Unofficial Windows Binaries for Python Extension Packages下载GDAL滚轮。

pip install "/path/to/GDAL‑3.0.4‑cp37‑cp37m‑win_amd64.whl"
通过在Django GDAL软件包python文件(/ path / to / virtual_env / Lib / site-packages)的第23行中添加“ gdal300”,来修改虚拟环境站点软件包中的 libgdal.py 文件。 /django/contrib/gis/gdal/libgdal.py):

elif os.name == 'nt':
    # Windows NT shared libraries
    lib_names = ['gdal300', 'gdal204', 'gdal203', 'gdal202', 'gdal201', 'gdal20']

最后,在Django项目的 settings.py 文件中添加

if os.name == 'nt':
    VENV_BASE = os.environ['VIRTUAL_ENV']
    os.environ['PATH'] = os.path.join(VENV_BASE, 'Lib\\site-packages\\osgeo') + ';' + os.environ['PATH']
    os.environ['PROJ_LIB'] = os.path.join(VENV_BASE, 'Lib\\site-packages\\osgeo\\data\\proj') + ';' + os.environ['PATH']

答案 2 :(得分:2)

在我的情况下(Windows10Pro + Python3.7.1),仅存在(自动选择的)dll是不够的,即gdal111.dll

我意识到我也有gdal204.dll位于C:\OSGeo4W\bin,并试图在第24行中用lib_names“丰富”名为'gdal204'的列表变量(关于Windows NT %PYTHON_ROOT%\Lib\site-packages\django\contrib\gis\gdal\libgdal.py的共享库,即

#[...]
elif os.name == 'nt':
    # Windows NT shared libraries
    lib_names = ['gdal204', 'gdal202', 'gdal201', 'gdal20', 'gdal111', 'gdal110', 'gdal19']
#[...]            ^^^^^^^

暂时没有负面影响。

答案 3 :(得分:0)

对于Microsoft Windows 10和Python3.6.8,我从Unofficial Windows Binaries for Python Extension Packages安装了GDAL 2.3.3,修改了libgdal.py,在lib_names列表gdal203中添加了env\Lib\site-packages\django\contrib\gis\gdal\libgdal.py

最后,将osgeo和proj添加到PATH,并按如下所示设置GDAL_LIBRARY_PATH(settings.py开头):

os.environ['PATH'] = os.path.join(BASE_DIR, r'env\Lib\site-packages\osgeo') + ';' + os.environ['PATH']

os.environ['PROJ_LIB'] = os.path.join(BASE_DIR, r'env3\Lib\site-packages\osgeo\data\proj') + ';' + os.environ['PATH']

GDAL_LIBRARY_PATH = os.path.join(BASE_DIR, r'env\Lib\site-packages\osgeo\gdal203.dll') 

在这种情况下,env是我的Python环境。

答案 4 :(得分:0)

要遵循的步骤:

  1. 运行python来检查您的python是32位还是64位。
  2. C:\OSGeo4WC:\OSGeo4W64中安装相应的OSGeo4W(32或64位):
    注意:选择“ Express Web-GIS安装”,然后单击“下一步”。
  3. 在“选择软件包”列表中,确保已选择GDAL;默认情况下,还将启用MapServer和Apache。
  4. 确保您的settings.py中包含以下内容:
import os
GDAL_LIBRARY_PATH = r'C:\OSGeo4W\bin\gdal300'
  1. 现在,如果服务器不工作,请继续运行它。在终端中运行以下命令。
set OSGEO4W_ROOT=C:\OSGeo4W
set PYTHON_ROOT=C:\Python3X 
set GDAL_DATA=%OSGEO4W_ROOT%\share\gdal 
set PROJ_LIB=%OSGEO4W_ROOT%\share\proj

答案 5 :(得分:0)

即使gdal204.dll位于预期的位置,并且使用正确的体系结构,我也遇到相同的错误“找不到指定的模块”(我通过在Python代码中添加断言并加载C程序中的DLL)。

原来是Python 3.7 app from the Microsoft Store的问题,the app description是在您第一次在命令行上键入python时自动安装的问题。 这个版本的Python拒绝载入GDAL DLL;我不知道这是错误还是安全功能。

我通过以下方式解决了该问题:

  • 卸载Python应用
  • 删除应用执行别名(如python.org中所述)
  • 从{{3}}安装常规Python程序包

答案 6 :(得分:0)

  1. here下载您的平台支持的GDAL wheel文件。
  2. 打开下载文件所在的命令窗口,并激活您的虚拟环境。

Activating your virtual environment

  1. 然后使用命令pip install name_of_the_file安装车轮。

Screenshot 2

您将看到 osgeo 文件夹已在'... \ Envs \ my_django \ Lib \ site-packages \'位置创建。

  1. 转到 osgeo 文件夹并复制 gdalxxx.dll 文件的完整路径,然后将其添加到setting.py文件中作为gdal库路径。例如

    GDAL_LIBRARY_PATH = r'C:\Users\WIN8\Envs\my_django\Lib\site-packages\osgeo\gdal300.dll'

答案 7 :(得分:0)

只需跟进Udi精美而详尽的答案即可(由于我的代表未满50岁,因此无法直接发表评论,它被标记为最有用的答案);

许多小时后,我尝试了他提供的解决方案,该解决方案也对我不起作用。 我收到以下错误:

OSError: [WinError 193] %1 is not a valid Win32 application

但是我呆在那里,发现尽管我运行的是64位python和操作系统(肯定),但它一直在寻找32位(OSGeo4W)文件夹。最终让我通过的是将OSGeo4W64文件夹的内容复制到OSGeo4W。希望可以节省您的时间。

另外一个注意事项:

请确保您在环境文件夹中编辑libgdal.py文件。它可能存在于多个位置-您的python文件夹和环境文件夹-如果您在python目录中编辑libgdal,它将无法正常工作。

答案 8 :(得分:0)

创建地图兼容数据库

我最近买了一台新笔记本电脑,不得不在我的新机器上安装 Python 和相关软件。我试图使用 OSGeo4W 创建一个 geodjango 兼容数据库,但忘记了 PostgreSQL 和 pgAdmin4 的作用。

当您从 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 安装最新的 PostgreSQL 设置时,您会同时获得 pgAdmin4。

注意 - 电子商务是我的个人服务器组。

enter image description here

当您创建 PostgreSQL 13 服务器时,您的服务器组将与我的不同。 enter image description here

当我第一次在新机器上打开 pgAdmin4 时,我保留了默认用户名“postgres”。如果您第一次登录 pgAdmin4 时选择了自己的用户名,则必须相应地更改以下值。 enter image description here

连接到数据库

在我的代码中

if os.name == 'nt':
import platform
OSGEO4W = r"C:\OSGeo4W"
if '64' in platform.architecture()[0]:
    OSGEO4W += "64"
assert os.path.isdir(OSGEO4W), "Directory does not exist: " + OSGEO4W
os.environ['OSGEO4W_ROOT'] = OSGEO4W
os.environ['GDAL_DATA'] = OSGEO4W + r"\share\gdal"
os.environ['PROJ_LIB'] = OSGEO4W + r"\share\proj"
os.environ['PATH'] = OSGEO4W + r"\bin;" + os.environ['PATH']
GDAL_LIBRARY_PATH = r'C:\OSGeo4W64\bin\gdal300.dll'

我收到一条关于 GDAL_LIBRARY_PATH 的错误消息,因此检查了 Windows 资源管理器。在发现我没有 gdal300.dll 文件时,我将代码更改为

GDAL_LIBRARY_PATH = r'C:\OSGeo4W64\bin\gdal301.dll'

enter image description here

答案 9 :(得分:0)

就我而言,安装 cp39 文件没有给我任何错误,而 cp310 给了我错误 (ERROR: GDAL-3.3.1-cp310-cp310-win_amd64.whl is not a supported wheel on this platform.):

pip install GDAL-3.3.1-cp310-cp310-win_amd64.whl  ❌

对比

pip install GDAL-3.3.1-cp39-cp39-win_amd64.whl  ✔
<块引用>

我想您必须不断尝试每个文件,直到获得兼容的结果。