从 10.x 到 ArcGIS Pro 的 Python 迁移

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

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

ArcPy 中的功能所做的更改

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

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

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

Python 3

ArcGIS Pro 使用 Python 3。Python 3 是一种常见的编程语言,适用于各种领域,包括数据分析、数据科学、质量保证以及 Web 和软件开发。

旧版本:

包括 ArcGIS DesktopArcGIS ServerArcGIS Engine 在内的早期 ArcGIS 产品使用 Python 2 版本。 Python 3 版本属于其他产品线,仅与 Python 2 部分兼容。虽然从根本上说,大部分语言内容是相同的,但许多细节均发生了变化,包括字符串和字典的工作原理以及标准库的组织方式。

ArcGIS ProPython 3 中转换现有脚本使用

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

较简单的 Python 脚本可能完全不需要更改,也可以正常运行。

下面各部分介绍了您容易遇到的 Python 2 和 3 之间的一些常见差异。 此外,关于移植到 Python 3 和迁移策略,可参考 http://python3porting.com/ 网站上 Lennart Regebro 发表的移植到 Python 3。 可以编写在 Python 2 和 Python 3 中运行的脚本。

标准库重组

Python 3 包含对 Python 2 标准库的重组。这些更改中的大部分更改将涉及已移至不同位置或者作为某个已重命名模块一部分的功能。 要编写同时在 Python 2 和 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 和 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()。 已从 Python 3 中移除 iteritems,并且 items 的行为与 iteritems 的行为相似。 上述操作同样适用于 rangexrange:已将 xrangePython 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 文档、图表、切片地图包以及个人地理数据库。