☰
Win7 64位下Python 2.7安装GDAL:源码编译与MSI避坑指南
2026/10/23 22:25:16 网站建设 项目流程

简介:在Windows 7 64位平台搭配Python 2.7安装GDAL,是很多GIS脚本开发者和遥感数据学习者常遇到的麻烦事,尤其会牵涉Visual Studio版本、GEOS依赖、环境变量与DLL引用等一连串坑。这份docx文档把完整过程整理成了可复用的排错笔记,明确区分了两条路径:一是基于GDAL core自带swig/python手工编译,适合想了解底层构建流程的读者;二是下载官方msi直接安装,适合快速上手、以应用为主的用户。文中还交代了Visual Studio 2010、GEOS 3.3.8、Python 2.7等前置条件,并针对swig.exe未找到、Vcvarsall.bat缺失、ImportError DLL load failed这类高频报错逐条给出了解决办法,尤其是将gdal安装目录下的bin文件夹加入环境变量Path这一步,能直接解决Python找不到gdal192.dll的问题。整份压缩包只有1个docx文件,大小95KB,内容集中、不掺杂质,已有628人学习浏览。对正在搭建Python 2.7 + GDAL环境的研究者来说,这是一份能照着排查、少走弯路的实用参考资料。

1. Win7 64位下给Python2.7装GDAL:你踩的坑基本都在这一篇

上周在一台Win7 64位机器上给Python 2.7配置GDAL,折腾了整整两天才跑通。这个组合今天看起来有点老旧,但接手老GIS项目的人大概率还得面对它。最折磨人的不是编译本身,而是一个又一个“找不到”——swig.exe不是内部或外部命令、Vcvarsall.bat找不到、DLL load failed。其中DLL加载失败最玄学,网上各式各样的说法都有,实际上往往只是环境变量里少了一个bin目录。这篇笔记把我试过的两条路都完整走了一遍:源码编译和官方MSI安装,并且把每一步报错的现象、原因和解决方式拆开写。手里正卡在GDAL安装上的开发者,照着做能省掉一晚上的排查时间。

2. 装前准备:环境清单与版本取舍

在动手之前,我先把环境清单列清楚:Win7 64位、VS2010、GDAL 1.9.2、GEOS 3.3.8、Python 2.7。这套组合看似杂乱,实际每条依赖都有自己的角色。把它们之间的关系理清,后面的报错才不至于瞎找。

2.1 依赖关系:VS2010、GEOS和Python2.7各管什么

VS2010不是Python包,而是一个C++编译环境。如果走源码编译路线,GDAL的C++核心库需要VC编译器来编;如果走MSI安装路线,其实根本不需要VS2010。但问题是,Python 2.7的官方Windows安装包是用VS2008(VC9)编译的,distutils在build扩展时默认去找VS2008的工具集,这就为后面的Vcvarsall.bat报错埋下了伏笔。这一点知道就行,下一章会专门处理。

GEOS 3.3.8是GDAL做矢量几何计算时依赖的库。如果只是用GDAL读写栅格数据,它不参与工作;如果要编译包含矢量拓扑功能的完整GDAL,配置依赖时会用到。我在实际操作中没单独安装GEOS的Python绑定,因为GDAL自带了对GEOS的调用支持,前提是编译时能找到GEOS开发库。

Python 2.7是你的使用端。无论走哪条路线,最终产物都是把GDAL封装成Python模块,放到site-packages里供import。Python的位数特别重要:Win7 64位系统上可以装32位Python,也可以装64位Python,两条路都没问题,但GDAL的版本位数必须和Python一致,否则就会出现典型的DLL加载失败。检查当前Python位数的方式是打开cmd执行:

python -c "import platform; print(platform.architecture())"

输出形如“('32bit', 'WindowsPE')”或“('64bit', 'WindowsPE')”,记下这个结果,后续下载MSI或编译时都要对着它选。

组件版本作用是否必须
VS201010.0编译C++核心库、提供nmake环境源码编译必须,MSI方案可不装
GDAL1.9.2栅格/矢量读写核心必须
GEOS3.3.8矢量几何计算依赖涉及矢量功能编译时需要
Python2.7运行环境、安装绑定模块必须

2.2 版本选择:GDAL 1.9.2还是GDAL 1.11.0

原笔记里提到尝试过GDAL 1.11.0,也确认过可以同法安装,但最终用了1.9.2。这种“退回老版本”的做法在Windows老环境里非常常见。我的判断是:1.9.2在Win7 + Python 2.7这个组合下资料最齐,报错时的解决方案一搜就有;1.11.0虽然功能更新,但安装流程本质上一样,不存在“新版必须换装法”这种说法。

如果是走MSI路线,版本选择影响更大。官方历史版本的MSI安装包对应不同Python版本,需要确认文件名里写的Python版本是2.7,并且匹配之前查到的位数。有些MSI同时支持32/64位,有些则分开了,下载时特别注意。选错位数不会给你任何提示,装完import才报错,非常浪费时间。

我个人的习惯是:系统Python是2.7就优先用GDAL 1.9.2或1.11.0这种和它同一时代的版本,避免用太老的稳定版或太新的开发版去跟Python 2.7的ABI硬凑。新版本不一定兼容2.7的C API,别给自己找事。

2.3 目录规划:路径里别带空格,统一放在英文目录

安装GDAL的路径值得在开工前就定好。我把源码解压到C:\OGC\GDAL192\gdal-1.9.2,这很关键。Windows下Program Files这类带空格的目录,在普通资源管理器里很好用,但一旦进入nmake、swig、setup.py这类命令行工具,空格会被解析成参数字符串的分隔符,轻则路径找不到,重则编译到一半莫名其妙失败。

C:\OGC\GDAL192\gdal-1.9.2

C:\OGC是我习惯的地理数据工作目录,你也可以换成自己的盘符,但一定要保证全路径没有空格、没有中文。MSI方案虽然能装到默认的Program Files目录,安装后我也建议把它加入Path时写成完整的短路径,必要时用8.3短名或环境变量替代。

另外,VS2010本身带空格的路径是系统自动处理的,使用它提供的命令提示符工具启动时,环境变量已经封装好,不会出问题。真正要小心的是你自己拷贝的压缩包、解压目录和后续设置的Path。

3. 源码编译:用SWIG把GDAL核心绑到Python 2.7

如果你想知道GDAL到底是怎么把C++能力暴露给Python的,走一遍源码编译比看十篇原理文章都管用。这个过程会依次依赖VS2010、SWIG和Python2.7的distutils,每一步都可能卡住,但每一步卡住的原因都是固定的,排查起来并不难。

3.1 打开VS2010 X64兼容命令提示符

首先,不要直接在普通cmd窗口里敲nmake,会提示找不到命令。必须以管理员身份打开“开始 > 所有程序 > Visual Studio 2010 > Visual Studio Tools > Visual Studio X64兼容工具命令提示符”。这个入口会预置VC的路径环境,让编译器、链接器和nmake程序维护工具都可用。

打开后先切换到源码目录:

cd C:\OGC\GDAL192\gdal-1.9.2\swig

这一步要在命令行里能看到“C:\OGC\GDAL192\gdal-1.9.2\swig>”这样的提示符,说明切换成功。如果提示路径不存在,检查压缩包是否解压完整,或者目录名是否写错,gdal-1.9.2目录名必须与压缩包解压出来的实际名称一致。

第一次敲nmake前,确认swig目录下确实有makefile.vc这个文件。它是专门为VC编译器写的makefile,里面描述了怎么用SWIG工具把gdal的C接口生成Python包装代码。

3.2 安装SWIG 2.10.0并加入Path

执行编译命令:

nmake /f makefile.vc python

大概率你会撞见第一个错误:

'swig.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。

原因很简单,机器上没有安装SWIG。SWIG(Simplified Wrapper and Interface Generator)负责读取gdal的接口文件,生成Python和C++之间的胶水层代码,缺少它整个编译无从谈起。

解决办法是下载swigwin-2.10.0(Windows版),解压到C:\swigwin-2.10.0,然后把解压目录加入Path:

set PATH=C:\swigwin-2.10.0;%PATH%

这行命令把SWIG的目录追加到现有Path最前面,让命令行在搜索可执行文件时优先找到swig.exe。这里有一个很容易忽略的细节:set PATH只对当前cmd窗口有效,如果你嫌弃这个临时方案,想一劳永逸,就去“系统属性-高级-环境变量”,在系统变量里编辑Path,把C:\swigwin-2.10.0追加进去。改完后必须新开一个cmd窗口,否则旧窗口读到的还是改动前的Path。

加入Path后,重新执行nmake /f makefile.vc python。这条命令会先清理没用的setup.ini,再调用swig.exe生成gdalconst_wrap.c等一堆C源码,最后调用VC编译器把它们编译成Python扩展的中间产物。看到控制台滚动输出“正在编译...”之类的信息就说明过了这一关。

3.3 编译Python绑定

nmake执行完毕后,进入python子目录:

cd python

此时目录下已经生成了setup.py,这是给Python的distutils用的构建脚本。接下来执行:

python setup.py build

这条命令读取setup.py,找到依赖的gdal头文件和库文件,把C扩展编译为.pyd文件。如果前面nmake步骤只生成了一半,这里会报缺少某个.h或.lib,需要回到swig目录重新nmake,确认没有fatal error再回来。

这里提个醒:build过程中出现一排一排的warning是正常现象,老GDAL代码配合新一点编译器,各种deprecated警告见怪不怪。只要没有“error”字样,就不要停下来折腾。过分关注警告反而浪费时间。

3.4 解决Vcvarsall.bat找不到问题

执行python setup.py build的另一个高频错误是:

unable to find Vcvarsall.bat

这个坑的本质是版本错位。Python 2.7的distutils默认认为你是用VS2008(VC9)编译的Python,所以它去检查环境变量VS90COMNTOOLS,找VS2008的目录并读取vcvarsall.bat。而你的机器上装的是VS2010,环境变量叫VS100COMNTOOLS,VS90COMNTOOLS根本不存在。

在同一个cmd窗口执行一行赋值:

set VS90COMNTOOLS=%VS100COMNTOOLS%

意思就是把VS2010的Tools目录路径借给VS90COMNTOOLS变量,让distutils认为VS2008就装在同一位置。然后再跑build和install:

python setup.py build python setup.py install

install会把生成的osgeo文件夹和gdal.py复制到Python 2.7的site-packages目录,同时把gdal-data所需的可选文件也一并处理。这一步之后,理论上Python侧已经有GDAL模块了。

3.5 DLL导出目录要进Path

走到这里别急着庆祝,打开Python尝试导入,你会见到第二个大坑:

ImportError: DLL load failed: 找不到指定的模块

原因不是Python模块没装好,而是Python进程在导入osgeo._gdal时,找不到依赖的gdal192.dll。GDAL编译时把生成的DLL放在bin目录,而Python的site-packages里只有Python包装文件,没有把DLL复制过去,运行时只能靠系统的Path去搜索。

解决办法是把包含gdal192.dll的bin目录加入Path:

set PATH=C:\OGC\GDAL192\bin;%PATH%

更稳妥的说法是,回到GDAL源码根目录,找到实际输出的bin目录(可能是Build\bin或gdal-1.9.2\bin,以你机器上gdal192.dll实际所在位置为准),把那个路径塞进Path。设置完后重新打开一个cmd窗口,再执行python,就能正常import了。

这条配置不只对源码编译方案有效,官方MSI方案安装完同样要面对它。所以我把DLL加载问题的排查单独放到了避坑章,但这里先记住结论:bin目录进Path,GDAL才能被Python找到。

4. MSI安装:不编译也能跑,最简单的方案

源码编译适合想看原理、或者必须自定义编译选项的人。如果只是为了在Python 2.7里能读写栅格影像,直接下载官方MSI安装包,双击一路Next,安装完配置好Path就好了。省下的时间拿来读几份报错排查文档,比什么都值。

4.1 找对版本:GDAL MSI与Python 2.7位数一致

MSI安装包是预编译好的二进制,官方为不同Python版本和不同系统架构分别提供安装包。这里最关键的检查点就是Python位数。Win7 64位系统只是操作系统位数,不代表Python一定是64位。如果Python装在“C:\Program Files (x86)\Python27”,那明显是32位Python,就必须选择32位(x86)的GDAL MSI。

在下载和安装前,用命令确认一下:

python -c "import platform; print(platform.architecture()[0])"

输出“32bit”就选32位包,输出“64bit”就选64位包。位数不匹配的症状和DLL缺失一模一样,都是DLL load failed,容易让人误判成Path配置问题,白折腾很久。

另外注意MSI文件名里一般会带完整版本号,还要看它是否声明支持Python 2.7。老项目使用GDAL 1.9.2或1.11.0系列时,这类包装兼容性做得好,和那些需要自行编译的版本不同,下载时优先选带exe或msi的官方渠道。

4.2 安装MSI并记录安装目录

双击MSI,安装向导会要求选择组件和安装路径。默认路径往往是“C:\Program Files\GDAL192”,带空格。前面提过,带空格路径在命令行工具里容易出问题,所以我会在向导里把安装位置改到纯英文目录,例如:

C:\GDAL192

安装过程很快,它会自动布置好bin、lib、data和Python扩展目录。其中bin目录放着gdal192.dll、gdalinfo.exe等可执行文件,Python扩展则直接安装到当前Python的site-packages里,不需要再执行python setup.py install。

这一步要注意:MSI方案不需要VS2010,也不需要SWIG,如果之前因为源码编译装了一大堆东西,也完全不影响MSI的使用,两者可以共存,只要环境变量Path里先后顺序别乱了就行。

4.3 配置环境变量:bin目录必须进Path

MSI安装完成后,直接打开Python执行:

python -c "from osgeo import gdal"

不出意外还是会报DLL load failed。原因和源码编译方案完全相同:Python加载GDAL模块时依赖的gdal192.dll在bin目录,而这个目录默认不在Path里。官方安装包装到了位,但没帮你把DLL搜索路径配好。

配置Path的方式有两种。临时生效:

set PATH=C:\GDAL192\bin;%PATH%

这种只对当前cmd窗口有效,适合顺手验证。长期生效则打开“系统属性-高级-环境变量”,在系统变量的Path里新建,填入C:\GDAL192\bin,确定保存。注意修改系统Path后,正在运行的所有cmd窗口都还保留旧环境,必须新开一个cmd窗口再启动Python,否则你连报错都已经看不到了。

4.4 两种方案对比

我装过几次GDAL,把两条路线的差异整理成了一张表:

对比项源码编译方案MSI安装方案
是否需要VS2010需要不需要
是否需要SWIG需要自行安装不需要
DLL位置编译输出bin目录安装目录bin
Python绑定安装方式setup.py installMSI自动安装
排错难度较高较低
适合场景需要自定义编译选项、想理解GDAL内部结构快速跑通、生产环境最小化安装

结论很直接:如果不是被编译选项卡住,直接用MSI。两种方案都能成功,和我的经验一致。我个人的习惯是先用MSI跑通业务,真遇到需要裁剪功能时再回头编译核心库,效率最高。

5. 避坑:从报错现象到解决方案的三次排查

编译和安装过程中,实际的报错其实就那么几个。把它们记住,下次在任何Win7 64位机器上给Python 2.7配GDAL,都能在几分钟内定位。下面按“现象-原因-解决”的顺序写我的排查记录。

5.1 swig.exe不是内部或外部命令

现象:在swig目录里执行nmake /f makefile.vc python,命令窗口返回“'swig.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件”,随后NMAKE报告致命错误U1077,退出码0x1。

原因:没有安装SWIG,或SWIG解压了但没有把swig.exe所在目录加入Path,命令行在系统搜索路径里找不到这个可执行文件。这是Windows上最普通的命令查找机制问题,和GDAL本身的代码无关。

解决:下载swigwin-2.10.0,解压为C:\swigwin-2.10.0,确认目录下存在swig.exe,然后执行:

set PATH=C:\swigwin-2.10.0;%PATH%

再重新执行nmake命令。如果是直接在新开cmd里操作,或者已在系统变量中加入该路径,不需要重复set。注意set PATH是临时增加目录,如果之前的cmd窗口是在set之前启动的,必须重新打开。

5.2 unable to find Vcvarsall.bat

现象:执行python setup.py build,distutils报unable to find Vcvarsall.bat,构建中止。

原因:Python 2.7在Windows上是用VS2008编译的,setup.py里默认通过VS90COMNTOOLS这个环境变量去找VS2008的安装路径,进而调用vcvarsall.bat初始化编译环境。机器上装的是VS2010,对应的环境变量是VS100COMNTOOLS,名称对不上,distutils当然找不到该找的文件。

解决:在当前cmd窗口执行:

set VS90COMNTOOLS=%VS100COMNTOOLS%

把VS2010的工具目录路径临时赋予VS90COMNTOOLS,让distutils在VS2008的名字下读到VS2010的路径。之后再执行python setup.py build。如果每次新开cmd都想要这行配置,就把它加到系统环境变量里,手动新建一个VS90COMNTOOLS,值填写VS100COMNTOOLS完整路径。网上也有人推荐改用mingw绕过VC编译,我在这个场景下试过,失败率太高,不推荐,老老实实借环境变量最稳。

5.3 ImportError: DLL load failed

现象:所有编译和安装步骤都成功,但在Python里执行import gdal或from osgeo import gdal,报“ImportError: DLL load failed: 找不到指定的模块”。错误信息可能指向osgeo/init.py里的swig_import_helper函数,imp.load_module加载_gdal模块时最后失败。

原因:Python的扩展模块osgeo._gdal只是一个包装壳,它真正依赖的gdal192.dll位于bin目录。如果bin目录不在Path里,操作系统的DLL搜索机制找不到这个动态库,于是抛出“找不到指定的模块”。很多人在这一步误以为是Python模块装错,把site-packages翻个底朝天也解决不了问题。

解决:确认gdal192.dll的实际位置,把该目录加入Path。我用的是MSI安装时指定的目录:

set PATH=C:\GDAL192\bin;%PATH%

源码编译方案则检查源码输出目录。加完Path后,一定要新开一个cmd窗口再启动Python,因为当前进程的环境变量不会自动刷新。重新执行import命令,顺利通过就说明问题就在这。这是整套安装里最容易翻车、也最容易修好的一环。

5.4 位数不匹配的坑

现象:按照上面所有方法设置好Path,重新开窗口,import gdal仍然报DLL load failed,或者偶尔出现“不是有效的Win32应用程序”之类的加载错误。

原因:GDAL的位数与Python的位数不一致。Win7 64位系统上常见组合是32位Python和64位GDAL,两边各自声称“已安装”,但实际上互不认识。Python是32位进程,加载64位DLL时直接失败,并且错误信息很可能还是“找不到指定的模块”,极具迷惑性。

解决:先查位数,再选对应安装包。检查命令:

python -c "import platform; print(platform.architecture())"

如果输出32bit,就卸载当前GDAL,重新安装x86版本的MSI;如果输出64bit,则安装64位版本。位数统一之后,再做一遍5.3的Path检查。

5.5 import gdal其实是一个过渡写法

现象:使用import gdal可以成功导入,但调用某些属性时弹出DeprecationWarning,或者在较新GDAL版本里直接报错。

原因:早期GDAL在Python里提供了gdal.py作为顶层兼容接口,它内部会转向osgeo.gdal。随着版本演进,官方推荐一律使用osgeo命名空间。老教程里的import gdal是那个年代的常见写法,但新项目照抄会踩到弃用警告的雷。

解决:代码里统一写:

from osgeo import gdal

如果需要显式注册驱动,在GDAL 1.x常执行gdal.AllRegister(),新版默认自动注册,但显式调用也不会有副作用。看到网上老教程里写import gdal时,替换成from osgeo import gdal再试试。

6. 装完怎么验证:最小栅格读出测试

配置完成不等于能用,验证的目标是让Python真正打开一个栅格文件并把元数据读出来。从那以后我每次给老机器配GDAL,都会用同一套步骤走一遍,五分钟内可以确认环境是否可靠。

先验证环境变量和DLL的加载是否正常:

echo %PATH%

检查输出里是否有GDAL bin目录。然后执行:

python -c "from osgeo import gdal; print(gdal.VersionInfo())"

如果输出版本号,例如192,说明DLL加载成功,GDAL核心库和Python模块已经接上了。如果这一步报ImportError,回到避坑章重新排查Path和位数。

找一个现成的tif文件,用Python脚本读它的基本信息:

# -*- coding: utf-8 -*- from osgeo import gdal gdal.AllRegister() ds = gdal.Open(r"C:\OGC\test.tif") if ds is None: print("打开失败:文件不存在或驱动不支持") else: print("影像宽: %d, 高: %d, 波段数: %d" % ( ds.RasterXSize, ds.RasterYSize, ds.RasterCount)) band = ds.GetRasterBand(1) print("波段1类型: %s" % gdal.GetDataTypeName(band.DataType)) ds = None

这段脚本里的gdal.Open是核心调用,任何GDAL版本都支持;AllRegister在GDAL 1.x里负责注册所有驱动,早期版本不执行的话可能打开某些格式失败。脚本执行成功并打印出宽高和波段数,说明栅格读写链路跑通。这里注意脚本最后把ds设为None,是主动关闭数据源,防止文件句柄一直不释放。

再确认模块到底装在哪里,方便日后卸载或排查:

python -c "import osgeo; print(osgeo.__file__)"

路径会指向类似Python27\Lib\site-packages\osgeo_init_.py的文件,看到这个路径说明绑定确实被安装到了当前Python环境,而不是别的地方。如果先后装过源码方案和MSI方案,这个路径能帮你确认到底哪一层在生效。

最后一步,我用一个很小的技巧:把验证脚本保存为check_gdal.py,以后换机器或重装环境时直接运行一遍。从那以后每次给老机器配GDAL,我都强制自己走完“echo PATH检查、VersionInfo打印、小影像读取”这三件事,没有一次被隐藏问题坑过。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询