从 10.x 到 ArcGIS Pro 的 Python 迁移

ArcGIS Pro 结合使用 Python 的方式与包括 ArcGIS DesktopArcGIS Server 以及 ArcGIS Engine 在内的其他 ArcGIS 产品不同。

地理处理工具针对 Pro 分析工具可用于突出显示任何妨碍 Python 代码或基于 Python 的地理处理工具运行的问题。针对 Pro 分析工具使用 Python 2to3 实用程序来报告潜在迁移问题以及识别没有迁移到 ArcGIS Pro 的工具和功能。

对 ArcPy 中的功能所做的更改

大多数地理处理工具将继续在 ArcGIS Pro 中可用,然而,有一些将无法使用。不包含 Coverage (arcpy.arc)、Parcel Fabric (arcpy.fabric)、Schematics (arcpy.schematics),以及 Tracking Analyst (arcpy.ta) 工具箱中所含的工具。其他工具箱中的其他工具也不可用。有关完整列表,请参阅 ArcGIS Pro 中不支持的工具列表

arcpy.mapping 模块已被移除,并且已经在 ArcGIS Pro 中替换为 arcpy.mp 模块,以支持在 ArcGIS Pro 中的制图工作流。

arcpy.na 模块同样包含更改,多个更改与从 arcpy.mappingarcpy.mp 的更改相关联。

升级到 Python 3

ArcGIS Pro 使用 Python 3。这是源自其他 ArcGIS 产品的重大变动,这些产品包括 ArcGIS DesktopArcGIS Server 和 ArcGIS Engine(已在 Python 2 产品线中应用并会继续应用各版本)。Python 3 产品线版本与 Python 2 产品线不兼容。虽然在本质上很多语言是相同的,但很多重要的详细信息已发生较大变化,包括字符串与字典的工作方式以及标准库的组织方式。

我们使用了五年的时间积极开发 Python 3,随着 Python 在线社区的移植,Python 3 与 Python 2 同时存在。此时,已经在 Python 3 中移植了大部分重要的第三方库,并且在 Python 在线社区中,达成了这样的共识,即所有新的开发工程都将在 Python 3 中完成。

如何才能在 ArcGIS Pro 和 Python 3 中使用我的脚本

重要的决策点在于您是否将更新 Python 代码以同时用在 10.x 和 ArcGIS Pro 中,或只用在 ArcGIS Pro 中。如果您正在对代码执行从 Python 2 到 Python 3 的单向转换,可以使用 2to3 命令行实用程序自动执行大部分的过程。该实用程序对于 Python 2 和 3 均可用。要特别注意的是,2to3 虽然是极佳的工具,但是它并不是完整的解决方案(有时估计为 95% 有效的解决方案),并且可能有必要对其进行其他更改。如果您需要支持 Python 2 和 Python 3,有关同时支持这两个版本的策略,请参阅如下内容。

请记住,更简单的 Python 脚本可能完全不需要任何更改,也可以良好地运行。

下面各部分讨论您容易遇到的 Python 2 和 3 之间较为常见的一些差异。此外,关于移植到 Python 3 和迁移策略,可参考 http://python3porting.com/ 网站上 Lennart Regebro 的移植到 Python 3。请记住,编写能够在 Python 2 和 Python 3 中运行的脚本是有可能的。

标准库重组

如 Python PEP 3108 中所述,Python 3 包含对 Python 2 标准库的重要重组。这些更改中的大部分更改将涉及已移至不同位置或者作为某个已重命名模块一部分的功能。要编写同时在 Python 2 和 Python 3 中使用的代码,可以通过使用灵活导入(例如 urllib2 等模块的以下内容)处理这些差异。

try:
    import urllib2  # Python 2
except ImportError:
    import urllib.request as urllib2  # Python 3

print 语句和函数

在 Python 2 中,较为常见的语法错误原因之一是 print 语句到 print 函数的转换。幸运的是,已将 print 函数移植回 Python 2 并且可安全用于 Python 2 和 Python 3 中。

print('This will print safely in Python 2 and 3')
# print statements will only work in Python 2
# print 'Print statements will only print safely in Python 2'

__future__

在脚本顶部,导入 __future__ 标记以在一些新的 Python 3 规则中限制 Python 2 代码。在您的脚本使用这一产品线正确进行解析后,您就可以顺利实现 Python 3 兼容性。

from __future__ import print_function, unicode_literals, absolute_import

字典

在适用时使用 dictionary.items(),而非 dictionary.iteritems()iteritems 从 Python 3 中移除,并且 items 的行为与 iteritems 过去的行为相似。上述操作同样适用于 rangexrange:已将 xrange 从 Python 3 中移除,并且 range 现在的行为与 xrange 相似。

字符串和编码

在 Python 3 中,当前引号中的内容都暗指 Unicode 字符串。字节数组取代了旧的 str 类型。unicode_literals 导入会隐式地将 Python 2 中引号的内容转换为 Unicode。

Python 3 在处理字符编码方面更加严格。如果您尚未将脚本显式保存为 UTF-8,则请执行这一操作。在您脚本的顶部添加 # coding: utf-8 等代码行,以便 Python 能够识别脚本采用了 UTF-8 编码格式。

io 模块

考虑使用 io 模块。该模块已引入 Python 2.6 并且随附于 Python 3 中;它以一种文本编码感知的方式提供用于处理众多输入和输出任务的简便方法。

不支持的数据格式

目前,ArcGIS Pro 不支持以下几种数据格式:栅格目录、几何网络、逻辑示意图数据集、地理数据库服务器、ArcMap 文档模板、ArcReader 文档、图表、切片地图包以及个人地理数据库。