Python Windows上的GeoDjango:“;找不到GDAL库";/&引用;OSError:[WinError 126]找不到指定的模块";

Python Windows上的GeoDjango:“;找不到GDAL库";/&引用;OSError:[WinError 126]找不到指定的模块";,python,django,postgresql,postgis,geodjango,Python,Django,Postgresql,Postgis,Geodjango,我一直在尝试设置我的windows计算机,这样我就可以拥有一个带有PostGIS扩展的本地postgreSQL。安装了它之后,我希望能够在将geodjango放到云中之前在本地创建一个项目。我已经在本地机器上使用Django和SQLite DB工作了一段时间,但是由于下一个项目将部分基于基于坐标的数据,我希望设置正确的环境 导入注意:我安装了mini conda,以便在单独的环境中运行。我在工作时确实激活了这种环境“发展” 我曾尝试在线关注geodjango的大部分信息/教程,但无法使其发挥作用

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

导入注意:我安装了mini conda,以便在单独的环境中运行。我在工作时确实激活了这种环境“发展”

我曾尝试在线关注geodjango的大部分信息/教程,但无法使其发挥作用。我所做的(主要是以下几点:):

  • 从下载并安装最新(10.3)的PostgreSQL安装程序
  • 安装后,我还使用应用程序堆栈生成器安装了PostGis
  • 我已从安装了OSGeo4W
  • 我已经按照geodjango网站()上的描述创建了一个批处理脚本,并以管理员身份运行它(除了设置python路径的部分,因为python已经在那里了,因为我已经使用python一段时间了)
  • 我在psqlshell中尝试了一些命令,我想我已经创建了一个名为geodjango、用户名:***和pass:***的数据库
  • 我不知道我是否给了geodjango用户所有的特权,但我怀疑是这样
  • 所有这些之后,我创建了一个新的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中设置数据库时,我运行(在正确的文件夹中):

    我得到以下错误:

    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.
    
    OSError: [WinError 126] The specified module could not be found
    
    OSError: [WinError 193] %1 is not a valid Win32 application
    
    我试着解决这个问题,但似乎没有任何效果。 有谁能帮我在本地建立这一切吗

    更新日期7-3-2018:

    • 我尝试过自己手动安装GDAL(来自:通用核心组件)
    • 我已经安装了(我假设是)来自的python绑定。但我还是犯了同样的错误
    • 我还尝试将GDAL_库_路径设置为GDAL目录或GDAL数据目录(位于GDAL目录中)
    现在我得到以下错误:

    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.
    
    OSError: [WinError 126] The specified module could not be found
    
    OSError: [WinError 193] %1 is not a valid Win32 application
    

    (当.dll存在时…

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

    • 运行
      python
      检查您的python是32位还是64位
    • 将相应的(32或64位)安装到
      C:\OSGeo4W
      C:\OSGeo4W64
      • 注意:选择Express Web GIS安装并单击下一步
      • 在“选择程序包”列表中,确保已选择GDAL;默认情况下,MapServer和Apache也处于启用状态,可以安全地取消选中
    • 确保
      设置.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检查
      以验证geodjango是否正常工作

    在我的例子(Windows10Pro+Python3.7.1)中,仅提供(自动选择的)dll是不够的,即
    gdal111.dll

    我意识到我还有
    gdal204.dll
    位于
    C:\OSGeo4W\bin
    ,并试图在
    %PYTHON\ROOT%\lib\site packages\django\contrib\gis\gdal\libgdal.py
    的第24行(关于Windows NT共享库)用
    'gdal204'
    来“充实”名为
    的列表变量,即

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

    现在没有负面影响。

    对于Microsoft Windows 10和Python3.6.8,我从安装了GDAL 2.3.3,修改了libgdal.py,在lib_名称列表中添加了
    gdal203
    env\lib\site packages\django\contrib\gis\GDAL\libgdal.py

    最后,将osgeo和proj添加到路径中,并将GDAL_LIBRARY_路径设置如下(settings.py的开头):

    在本例中,env是我的Python环境。

    以下步骤:

  • 运行python检查python是32位还是64位
  • 将相应的OSGeo4W(32或64位)安装到
    C:\OSGeo4W
    C:\OSGeo4W64

    注意:选择Express Web GIS安装并单击下一步
  • 在“选择程序包”列表中,确保已选择GDAL;默认情况下,MapServer和Apache也处于启用状态
  • 确保
    设置.py中包含以下内容:
  • 导入操作系统
    GDAL\u LIBRARY\u PATH=r'C:\OSGeo4W\bin\gdal300'
    
  • 现在,如果服务器不工作,请继续运行服务器。在终端中运行以下命令

  • 在我的Windows10Pro机器上更新了一些OSGEO4W之后,我又开始遇到GDAL绑定的问题。我以前使用了这里发布的解决方案和

    这就是我在使用Windows10Pro 64位、Django3.0.6和GDAL3.0.4以及Python3.7虚拟环境时的工作原理。我在没有OSGEO4W的情况下测试了它,它似乎很有效

    首先,从下载GDAL控制盘

    修改虚拟环境站点包中的libgdal.py文件,方法是将“gdal300”添加到Django-GDAL包python文件的第23行(/path/to/virtual_-env/Lib/site-packages/Django/contrib/gis/GDAL/libgdal.py):

    最后,在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']
    
    我遇到了相同的错误“找不到指定的模块”,即使
    gdal204.dll
    存在于预期位置,具有正确的体系结构(我通过在Python代码中添加断言并从C程序加载dll来验证)

    原来是的问题,第一次在命令行上键入
    python
    时自动安装的问题。 这个版本的Python拒绝加载GDAL DLL;我不知道这是一个bug还是一个安全特性

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

    • 卸载Python应用程序
    • 删除应用程序执行别名(如中所述)
    • 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']
    OSError: [WinError 193] %1 is not a valid Win32 application
    
    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 = r'C:\OSGeo4W64\bin\gdal301.dll'