调试 Python 代码

Python 用于 ArcGIS Pro 应用程序的很多部分。 集成开发环境 (IDE) 是为代码程序员提供编辑和调试功能的应用程序。 IDE 有助于提高代码编写和故障排除的简易性和高效性。 Python IDE 可用于制作和故障排除脚本工具以及 Python 工具箱验证和执行代码。

IDE

Microsoft Visual Studio

以下 ArcGIS Pro 组件可在 Visual Studio 中调试:

  • 脚本工具执行
  • 脚本工具验证
  • Python 工具箱

必须安装以下 Visual Studio Workload:Python 开发。 请参阅 https://docs.microsoft.com/en-us/visualstudio/install/modify-visual-studio

要在 ArcGIS Pro 中调试 Python 代码,请从以下步骤入手:

  1. 启动 Microsoft Visual Studio
  2. 在主菜单上单击调试 > 连接到进程
  3. 连接到进程对话框中,单击选择按钮。
  4. 选择代码类型对话框中,相继选中调试这些代码类型Python,然后单击确定
    注:

    您必须选择附加到:Python 代码。 请勿使用默认代码类型自动:托管(v4.6、v4.5、v4.0)代码、Python 代码

  5. 在可用进程列表中,单击 ArcGISPro.exe 进程,然后单击附加按钮。

将 IDE 与 ArcGIS Pro 分离之后,Python 代码中的异常将无法正确显示。 重新附加 IDE 或重新启动 ArcGIS Pro 可解决该问题。

注:

Microsoft Visual Studio 2017 可用于调试 ArcGIS Pro 2.1 及更高版本。 两个应用程序中的较早版本将不会起作用。

PyCharm 专业版

以下 ArcGIS Pro 组件可在 PyCharm 专业版中调试:

  • 脚本工具执行
  • 脚本工具验证

pdb 模块

pdb 模块是 Python 标准库的一部分。 该模块并非完全开发的 IDE,但可用于交互式源代码调试。 pdb 模块不能用于在 ArcGIS Pro 内进行调试,但是可以用于调试独立脚本,包括脚本工具的执行代码。

使用 pdb 模块可用于调试正在独立 Python 脚本中运行的脚本工具执行代码。 向脚本工具代码中添加断点(使用 import pdb;pdb.set_trace()),然后运行调用该脚本工具的 Python 脚本。 在遇到断点时,Python 会进入交互模式。 请记住在调试工作完成时移除断点代码。

调试脚本工具验证代码

IDE 只能调试 Python 文件 (.py)。 对于脚本工具验证中的 Python 代码(嵌入到工具箱中),将代码复制到外部 Python 文件,并将 Python 工具箱中的代码替换为以下示例。 然后可以打开 IDE 中的 Python 文件并设置断点,将 IDE 附加到 ArcGIS Pro,之后运行脚本工具。 完成代码修改后,将 Python 文件内容复制回工具验证。

在以下示例中,val.py 包含 ToolValidator 类,并以 .tbx 文件形式保存到相同的目录中。

import sys
import val

# the following code will reload the val.py module if it's modified
if 'val' in sys.modules:
    import importlib
    importlib.reload(val)

# ToolValidator should exist at the global scope
ToolValidator = val.ToolValidator

当用户与工具进行交互时,会反复执行脚本工具验证中的验证代码。

调试 Python 工具箱

IDE 只能调试 Python 文件 (.py)。 对于 Python 工具箱文件中的代码 (.pyt),将代码复制到外部 Python 文件,然后将 Python 工具箱中的代码替换为以下示例。 然后可以打开 IDE 中的 Python 文件并设置断点,将 IDE 附加到 ArcGIS Pro,之后使用 Python 工具箱。 完成代码修改后,将 Python 文件内容复制回 Python 工具箱。

在以下示例中,pyt_code.py 包含 Python 工具箱中常见的代码,并与 .pyt 文件保存到相同的目录中。

from pyt_code import *

加载工具并与其进行交互时,会多次执行 Python 工具箱中的代码。