资讯详情

ArcGIS内置Python环境配置:安装pip与gdal实现arcpy协同

📅 2026/10/3 9:49:07 | 华诺云谱 👁 阅读
ArcGIS内置Python环境配置:安装pip与gdal实现arcpy协同
做GIS批处理的人十有八九都撞上过这个尴尬场景桌面端 ArcGIS 10.2.2 装好后自带 Python 2.7.5 就躺在C:\Python27\ArcGIS10.2里平时写个 arcpy 脚本处理要素类没问题可真想用 pip 装个第三方库或者让 gdal 去读大影像就会发现这个环境连 pip 都没有各种报错能把你卡在原地。这篇教程解决的就是这个痛点核心三件事给内置 Python 2.7.5 装上 pip、把 gdal 顺利装进这个老环境、再让 arcpy 和 gdal 在同一个脚本里配合不打架。适合正在和 ArcGIS 批处理、影像裁剪拼接、数据格式转换死磕的测绘、土地、规划、自然资源相关从业者你用得上。1. 为什么死磕内置环境而不是另装一套 Python1.1 arcpy 和内置 Python 是绑定的很多人第一个念头是ArcGIS 自带的 Python 太老我自己装个新的 Python 不就行了如果完全不碰 arcpy 只做 gdal 处理这个思路没错但只要你还想在同一个脚本里调用 arcpy 的要素管理、几何修复、拓扑检查等能力你就绕不开内置解释器。原因在于 arcpy 并不是一个纯粹的第三方 Python 库。它由 ESRI 开发安装 ArcGIS Desktop 时会将模块文件写入到安装目录的Lib\site-packages下同时还要读取本机的许可服务。你另装一个 Python 环境import arcpy 大概率会直接抛ModuleNotFoundError或者ImportError: DLL load failed就算你把 arcpy 整个文件夹复制到新环境也会因为底层 C 扩展对应的编译器版本、Python ABI 不一致而崩溃。我早年试过把 arcpy 硬塞进 Anaconda 里折腾两天最后还是老老实实回退到了内置环境。1.2 自带环境里其实藏着不少东西打开命令行输入C:\Python27\ArcGIS10.2\python.exe你会发现这个环境并不算“裸”。它自带 numpy所以做栅格数组运算没问题自带 sqlite3、json、logging 等标准库日常脚本都够用还带一个pythonw.exe可以无黑窗运行 GUI 小程序。最关键的是因为 ArcGIS 10.2.2 时代桌面端还是 32 位应用所以内置 Python 是 32 位的这反而让很多老包、老动态库变得非常好装。1.3 什么时候可以另选环境只有两种场景我会建议你放弃内置环境一是你已经完全不用 ArcGIS 桌面端只做 gdal 栅格处理二是你用 ArcGIS Pro它自带新一代 Python 3 环境那是另一套玩法。否则一台机器上同时存在两套 Pythonpip 命令乱指、import 模块冲突的问题会比想象中的更麻烦。2. 先给内置 Python 装上 pip老版本有老版本的门道2.1 先确认到底有没有 pip不用猜直接验证C:\Python27\ArcGIS10.2\python.exe -m pip --version如果提示No module named pip那就说明这个内置环境没有装 pip。注意这时候不要试python -m ensurepipPython 2.7.5 时代的内置环境还没有集成 ensurepip 机制执行后大概率会提示ensurepip is not available。直接走 get-pip.py 这条老路。2.2 下载支持 Python 2.7 的老版本 get-pip.py现在直接从 pypa 官网下载的 get-pip.py 已经不支持 Python 2运行时会直接提示 Python 2.7 已停止维护然后退出。正确做法是访问https://bootstrap.pypa.io/pip/2.7/get-pip.py这是一个专门给 Python 2.7 保留的最后版本对应 pip 20.3.4。把页面内容用浏览器“另存为”保存到本地文件名get-pip.py然后执行C:\Python27\ArcGIS10.2\python.exe get-pip.py安装完成后pip 和 setuptools 会一起写入C:\Python27\ArcGIS10.2\Lib\site-packages脚本入口则出现在C:\Python27\ArcGIS10.2\Scripts目录下。2.3 为什么非要写python -m pip而不是直接敲 pip这是新手最容易踩的坑。Windows 的命令行里直接敲 pip系统会按照 PATH 环境变量去找 pip.exe。如果这台机器后来装过别的 Python、ArcGIS Pro 自带的 Python、或者是某个软件捆绑的 PythonPATH 里靠前的那个解释器会优先抢到 pip 命令结果就是“你明明给内置环境装了 pip输入 pip 却报……”pip 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。或者pip fatal error in launcher: unable to create process using ...原因基本都是 pip.exe 启动时找到了错误的 Python 路径。规避方法很简单所有 pip 操作都显式指定解释器写成C:\Python27\ArcGIS10.2\python.exe -m pip install 包名这样无论 PATH 怎么乱pip 都会被绑定到你指定的内置环境上。提示如果python.exe -m pip这个命令本身可以运行说明环境没坏只是直接敲 pip 时的指向有问题。不要急着卸载重装优先用“python -m”写法。2.4 顺手把 pip 源换掉老环境的下载速度能提升几倍Python 2.7 的老环境使用 pip 时的另一个痛点是网络。默认官方源在国内访问速度不稳定大一点的包动不动就超时。推荐把它改成国内的镜像源这里以清华镜像为例。永久生效的配置位置在用户目录下C:\Users\你的用户名\pip\pip.ini如果pip文件夹不存在手动新建一个。pip.ini内容如下[global] timeout 60 index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn保存后再用python -m pip install就会自动走镜像源下载速度差距非常明显。临时指定源也可以比如C:\Python27\ArcGIS10.2\python.exe -m pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple3. gdal 装进 Python 2.7.5 的正确姿势3.1 为什么直接pip install gdal会让人崩溃按一般思路装 gdal 自然是pip install gdal但很快你就会看到一长串编译日志最后跳出一句error: Microsoft Visual C 9.0 is required. Get it from ...或者Unable to find vcvarsall.bat问题出在 gdal 这个包在 Python 索引里的 source 发行版包含 C 扩展源码pip 在 Windows 上找不到合适的编译器就会失败。Python 2.7 时代官方推荐的编译器是 Visual C 2008VC9新电脑上几乎没人专门装它。所以不要硬编译直接找预编译的 wheel 包。3.2 选对 wheel 包的三个硬条件ArcGIS 10.2.2 自带 Python 是 32 位的即使你的操作系统是 64 位也没关系安装包必须对应 Python 版本和系统位数。三个条件缺一不可Python 版本标识必须是cp27平台标识必须是win32选择支持 Python 2 的最后几个稳定版本比如 GDAL 2.2.4 或 2.4.4一个可行的文件名大概是GDAL-2.4.4-cp27-cp27m-win32.whl文件下载后在命令行执行C:\Python27\ArcGIS10.2\python.exe -m pip install GDAL-2.4.4-cp27-cp27m-win32.whl看到Successfully installed GDAL-2.4.4就说明装上了。注意有些 whl 文件名很接近但cp27m和cp27mu是不同的 ABI 标识Windows 上一般选cp27m。选错会直接报is not a supported wheel on this platform换一个版本就能解决。3.3 安装后验证除了版本号还要查 DLL安装完成后在命令行进入 Python 交互模式C:\Python27\ArcGIS10.2\python.exe然后执行from osgeo import gdal, ogr, osr print(gdal.VersionInfo())如果正常打印出版本号说明核心安装成功。如果报ImportError: DLL load failed: 找不到指定的模块那多半是 gdal 的动态库没有被系统找到。gdal 的许多 DLL 被安装到了C:\Python27\ArcGIS10.2\Lib\site-packages\osgeo目录下而这个目录没有被加入 PATH。解决办法是在脚本开头先把路径塞进环境变量import os os.environ[PATH] rC:\Python27\ArcGIS10.2\Lib\site-packages\osgeo ; os.environ[PATH] from osgeo import gdal, ogr, osr这一招几乎能解决所有“gdal 装上但 import 报错”的问题。3.4 顺便再装几个常用库内置环境里 numpy 已经有了但数据分析时你可能还想用 pandas、psycopg2、openpyxl 这些。安装方式一样C:\Python27\ArcGIS10.2\python.exe -m pip install pandas注意 pandas 的较新版本在 Python 2.7 上不稳定建议用pandas0.24.2这类最后支持 Python 2 的版本。装之前可以先python -m pip list看看当前环境里已有哪些包避免重复安装造成版本混乱。4. 让 arcpy 和 gdal 在一段脚本里默契配合4.1 二者共存其实不冲突很多同学担心一个脚本里同时import arcpy和from osgeo import gdal会起包名冲突。至少我在这个内置环境下测过二者可以共存。arcpy 走的是 ESRI 的模块体系gdal 走的是独立的 osgeo 入口命名空间上井水不犯河水。真正的难点在于两个库操作同一份数据时如何处理文件锁、坐标系统和编码。4.2 一个综合示例修复几何、读取栅格、输出新栅格我写一个贴近实际工作的脚本把 arcpy 的矢量和 gdal 的栅格能力串起来。场景是先修一份面要素的几何错误再用 gdal 读一下 DEM 影像最后输出一个放大了两倍像元值的 GeoTIFF。# -*- coding: utf-8 -*- import arcpy from osgeo import gdal, osr # 开启覆盖输出避免二次运行报错 arcpy.env.overwriteOutput True arcpy.env.workspace uD:\\gis_data\\shp in_fc ulanduse.shp out_fc ulanduse_repair.shp # 1. arcpy 修复几何错误 arcpy.RepairGeometry_management(in_fc, out_fc) print u修复完成: {0}.format(out_fc) # 2. gdal 读取 DEM src_path uD:\\gis_data\\dem.tif src_ds gdal.Open(src_path) if src_ds is None: raise IOError(u无法打开影像检查路径是否存在{0}.format(src_path)) band src_ds.GetRasterBand(1) data band.ReadAsArray() print u影像尺寸: {0} x {1}.format(src_ds.RasterXSize, src_ds.RasterYSize) # 3. 检查坐标系是否一致 sr_arcpy arcpy.Describe(out_fc).spatialReference sr_gdal osr.SpatialReference() sr_gdal.ImportFromWkt(src_ds.GetProjection()) if sr_arcpy.factoryCode ! sr_gdal.GetAuthorityCode(None): print u警告: 矢量与栅格坐标系不一致请确认后再继续 # 4. 写出新栅格 driver gdal.GetDriverByName(GTiff) out_ds driver.Create(uD:\\gis_data\\dem_double.tif, src_ds.RasterXSize, src_ds.RasterYSize, 1, gdal.GDT_Float32) out_ds.SetProjection(src_ds.GetProjection()) out_ds.SetGeoTransform(src_ds.GetGeoTransform()) out_band out_ds.GetRasterBand(1) out_band.WriteArray(data * 2) out_ds.FlushCache() # 5. 释放文件句柄 out_ds None src_ds None del data print u全部处理完成这个脚本基本概括了日常配合使用的几个关键点arcpy 处理完矢量gdal 读取栅格然后比较坐标系、写新栅格。最后那句out_ds None和src_ds None特别关键不做这步的话被占用的影像文件可能一直没法被其他程序删除或覆盖。4.3 坐标系统互转的两个常用方法arcpy 和 gdal 对坐标系统的表示方式不同。arcpy 里要素类的 spatialReference 可以通过factoryCode拿到 WKIDgdal 的空间参考则是osr.SpatialReference对象可以从 WKT 导入。互相转换的常用写法# gdal 转 arcpy sr_gdal osr.SpatialReference() sr_gdal.ImportFromEPSG(4326) arcpy_sr arcpy.SpatialReference(sr_gdal.GetAuthorityCode(None)) # arcpy 转 gdal arcpy_sr arcpy.Describe(in_fc).spatialReference sr_gdal osr.SpatialReference() sr_gdal.ImportFromWkt(arcpy_sr.exportToString())核心思路是 gdal 用 WKTarcpy 用 WKT两边都通过 WKT 对接就不会出现坐标系上下颠倒或者单位不一致的问题。4.4 中文路径和 Python 2 编码问题Python 2.7 的字符串默认是字节串不是 Unicode。路径里一旦出现中文arcpy和gdal都有可能抛UnicodeDecodeError。我的经验是脚本开头固定写# -*- coding: utf-8 -*-所有文件路径都写成u...形式尽量不在路径里混用加号字符串拼接。如果你在print中文时控制台乱码可以把代码保存为 UTF-8 编码后重新设置控制台代码页或者在 ArcGIS 的 Python 窗口里运行就不会有这个问题。5. 高频报错速查表与几个保险操作5.1 常见问题对照表下面这张表是我实际排障过程中整理出来的高频问题按“看到什么报错就查什么”的方式使用。报错信息原因解决办法No module named pip内置环境没有安装 pip走 get-pip.py 老版本安装流程pip 无法将“pip”项识别为 cmdlet系统 PATH 里没有 pip或指向其他 Python 的 pip使用python -m pip或把 Scripts 目录加入 PATHis not a supported wheel on this platformwheel 包平台、Python 版本不符核对 cp27、win32 标识Unable to find vcvarsall.bat源码编译时缺少 VC9 编译器放弃编译换用预编译 wheelImportError: DLL load failedgdal 的 DLL 路径不在 PATH脚本开头动态添加 osgeo 目录到 PATHERROR 4: Unable to open影像路径不存在或文件名含中文检查路径改用英文目录名或 u 前缀UnicodeDecodeErrorPython 2 默认编码问题用 Unicode 字符串表示路径脚本头加编码声明5.2 环境备份宁可多备份不可赌运气内置环境一旦搞乱重装 ArcGIS 成本太高。我的做法是在所有配置完成、gdal 和常用库都验证无问题后把整个C:\Python27\ArcGIS10.2目录复制一份到移动硬盘或 D 盘做备份。这个目录本质上是绿色可用的出问题时把备份复制回来再把系统环境变量指过去就行。如果想更精确一点先输出依赖清单C:\Python27\ArcGIS10.2\python.exe -m pip freeze requirements.txt以后要恢复时C:\Python27\ArcGIS10.2\python.exe -m pip install -r requirements.txt不过要注意Python 2.7 的pip freeze会把 numpy 这类包也列进去恢复安装时使用镜像源才不会太痛苦。5.3 把内置 Python 配置到 PyCharm命令行和 IDE 都能用命令行用的时间长了重度脚本开发我还是建议配一个 IDE不然代码长一点就难维护。以 PyCharm 为例新建项目后在File - Settings - Project - Python Interpreter里点击齿轮选择 Add然后指向C:\Python27\ArcGIS10.2\python.exe配置完成后PyCharm 的代码补全、调试器都能正常工作但你仍然可以继续用命令行里的python -m pip安装包两边共用同一个 site-packages不会出现 IDE 里能运行、命令行里却报错的情况。5.4 一个容易被忽略的小细节Scripts 目录的 PATH如果你希望直接在命令行敲pip而不是每次打一长串python -m pip可以在系统环境变量 PATH 里追加这两个目录C:\Python27\ArcGIS10.2 C:\Python27\ArcGIS10.2\Scripts但前提是这台机器上没有其他 Python 抢占pip命令。如果还有其他 Python我建议还是用python -m pip虽然多打几个字符但永远不会错。再分享点个人经验。我在实际项目中踩过最深的坑不是装不上而是装好后过两个月回到这个环境发现 pip 命令指向了别的解释器gdal 导入也开始乱套。所以后来我给自己定了一条纪律凡是碰 ArcGIS 内置环境操作前后都要先敲一遍python -m pip --version确认解释器路径再敲一遍python -c from osgeo import gdal; print(gdal.VersionInfo())确认 gdal 可用两行验证跑通再继续。这个习惯虽然简单但真的能省下大量排障时间。最后再补一个小技巧如果把整个环境备份文件连同 requirements.txt 一起放到项目目录里哪天换电脑重构环境照着清单一次还原十分钟就能恢复全部战斗力。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑