编码错误不可避免,但可通过两种基本的方法找出错误:
- 将某种形式的 print 语句添加到代码中以便帮助隔离存在的问题。
- 使用交互式调试程序。
使用 print 语句
通过 print 语句找出缺陷是一种显而易见的常规方法。由于脚本工具可以访问工具进度对话框,因此可以将脚本编辑为包含对 AddMessage()、AddWarning() 或 AddError() 的调用,以便将值和检查点信息送入进度对话框。另一种方法是使用返回消息这种独立方法,如 win32ui 模块的 MessageBox 方法。使用此方法时将显示一个弹出对话框。由于必须单击对话框中的确定才能继续执行操作,因此使用该方法可按步骤执行脚本。下方是使用两种方法的示例:
import arcpy
import win32ui
import win32con
n = 5
# Print message to progress dialog
#
arcpy.AddMessage("Value of n = {}".format(n))
# Issue a popup dialog with OK and Cancel button
#
val = win32ui.MessageBox("Value of n = {}".format(n), "title",
win32con.MB_OKCANCEL)
# Based on the button clicked, you can branch execution
#
if val == 1:
arcpy.AddMessage("You clicked OK")
else:
arcpy.AddError("You clicked Cancel")
raise arcpy.ExecuteError, "Execution stops due to Cancel button click"
arcpy.AddMessage("This statement reached")
使用调试程序
另一种方法是使用支持调试的 Python 集成开发环境 (IDE)。通过调试程序可在无需修改代码的条件下,设置中断点;进入、跳出以及越过各行代码;检查变量的内容。与插入 print 语句相比,调试程序更高效且通常可快速地隔离缺陷。
普通 IDE 包括以下内容:
- 随 Python 安装的 Python IDE
- PythonWin,获取网址为 https://sourceforge.net/projects/pywin32
- PyScripter,获取网址为 http://code.google.com/p/pyscripter
- 商用系统,如 Wing IDE (http://wingware.com)
使用调试程序的一种方式是在 IDE 中直接打开脚本,修改该脚本以使所有参数均已赋值,然后继续调试。如果情况简单,此方法非常适合。但如果脚本使用的是图层或表视图参数,则必须动态创建这些变量。复杂的参数(如字段映射或空间参考)很难创建为变量。
理想情况下,需要打开脚本工具对话框、输入参数然后为准备好要进行调试的代码启动 IDE。要实现上述目的,需要进行一些简单的更改(如下所示)。
使用 GetParameterAsText()
第一步是将脚本修改为使用 GetParameterAsText() 而非 sys.argv[],如了解脚本工具参数中所述。 此修改可以保留,稍后无需将代码更改回使用 sys.argv[]。
执行和调试工具
- 在地理处理 > 地理处理选项中设置调试程序(如 PythonWin)。
- 在目录 窗口中,右键单击工具,然后单击调试。
- 在工具箱中打开脚本工具,输入任意要设置的参数,然后单击确定。打开 IDE 可能需要花费一些时间。脚本代码显示后,便可以像通常需要的那样与调试应用程序自由交互。
您可以设置中断点从而使脚本只运行到该中断点,也可以使用调试程序中的所有其他可用选项。在对话框中输入的参数值可通过 GetParameterAsText() 获取。
运行脚本时,脚本与应用程序之间仍将发生通常会预料到的交互。因此,如果使用 AddMessage()、AddWarning() 或 AddError() 等函数,则信息会显示在应用程序中。如果使用进度条功能,则随着脚本的调试,进度条将在工具对话框中更新。完成脚本调试后,便可关闭调试程序以便返回应用程序。如果计划再次调试脚本工具,您也可以使调试程序保持打开状态并单击工具进度对话框中的取消。