调试ArcPy脚本?


50

我已经在ArcGIS 10中使用ArcPy编写了许多Python脚本,到目前为止,我唯一的调试方法仅限于使用来将消息打印到地理处理结果窗口arcpy.AddMessage()

还有其他选项,例如设置断点吗?

杰森的方法效果很好。如果您的工具箱中有错误(例如验证),则IDE可能无法查明问题,因为工具箱已编码。至少WING无法查明。


也许这里有选择?google pyscripter代码
Brad Nesom 2011年

ArcGIS的帮助,讨论如何使用的PythonWin调试器
里根Sarwas

在OS文件属性中,您是否尝试过将.py文件的默认程序设置为PyScripter?
KiloGeo 2011年

通过这样做,我是否不能有效地告诉操作系统我不想运行我的python脚本,而只是在编辑器中打开它?
RyanDalton 2011年

是,对的。对不起,我误会了你的目的。
KiloGeo 2011年

Answers:


37

通常,Python调试器/ IDE假定Python脚本与其本身在同一进程中运行,因此调试在ArcMap.exe中运行的脚本是正确的-您需要获取足够的Python脚本引导的GP脚本环境。调试。

在过去几年中对我来说效果很好的一种方法是编写一个简单的脚本,该脚本仅调用该工具并将其用作我在Python IDE(Wing或Pythonwin)中的主要脚本,并在该工具的.py中设置断点。文件也在同一IDE会话中打开。

所以基本上我这样做:

  1. 获取在我的脚本工具中不起作用的一组输入
  2. 在与调用该工具的.tbx相同的文件夹中打开一个简单的.py文件
  3. 在IDE中打开调用者脚本和脚本工具.py文件
  4. 在脚本工具文件中设置断点
  5. 运行调用者脚本

我的呼叫者脚本通常非常简单:

import os
import arcpy
arcpy.ImportToolbox(os.path.join(os.path.dirname(__file__), 'my.tbx'))
arcpy.MyToolThatIsFailing_myalias("inputs", "that", "don't" "work")

我已经尝试过用Winpdb调试在ArcMap中运行的脚本,但是我从来没有碰运气。如果您想尝试一下并使其正常运行,请分享您的发现。


1
不错的解决方案!我会试试。
乔治·席尔瓦

过去,我已成功使用winpdb调试长进程脚本。一旦设置好winpdb,您就可以“跳入”当前运行的独立脚本,或者理论上可以在另一个进程(例如ArcMap)中“跳入”并正常调试它。这对于签入需要数周时间才能完成的脚本非常方便。我没有尝试在ArcGIS应用程序进程中调试arcpy。
blah238 2011年

我会推荐PyCharm。它像魔术一样工作
user39901230 2011年


9

对于10岁以下的用户,显然最好的选择是Jason的帖子,我将其标记为“最佳答案”。对于9.3的用户,我能够按照Brad帖子中链接的ESRI KB支持说明进行操作

最终,要在Pyscripter中默认编辑ArcGIS python脚本,关键是要编辑以* .py文件结尾的“已注册文件类型”的系统“操作”(步骤#4)。我创建了一个新的“编辑”操作类型,然后包含了Pyscripter.exe路径。完成此操作后,将默认的编辑操作设置为启动Pyscripter而不是IDLE。

我使用的字符串(因为它在下面显示的对话框中被截断了)是:

"C:\Program Files\PyScripter\PyScripter.exe" "%1"

在此处输入图片说明


1
+1,如果可以的话,再一次,因为包括字符串而不只是图像(文本更容易复制和粘贴!)。
马特·威尔基2011年

7

我不知道如何在arcpy中使用它,但是您可以尝试pdb

import pdb; pdb.set_trace()

带有eclipse的pydev也有类似的功能,在此进行介绍。您可以将eclipse设置为侦听信号,然后可以通过pydevd.settrace()函数调用在完全在eclipse外运行的代码中触发该信号。urbansim.org/Documentation/DebuggingWithEclipse
AKO

0

我发现调试代码最直接的方法是将输入的内容硬编码到现有数据集的文件路径中。例如:

import arcpy

# parameters for script
#input1 = arcpy.GetParameterAsText(0) # layer
#input2 = arcpy.GetParameterAsText(1) # folder

# debugging parameters
input1 = r"path/to/your/data.shp"
input2 = r"path/to/your/folder"

除了结果窗口外,python窗口还会产生有用的错误消息和/或允许您测试代码段。

任何优秀的IDE都具有调试探针,该探针将在内存中包含直至当前断点的所有处理。这样,您可以查看数据的状态。在要暂停脚本的位置设置断点。如果要在特定的迭代中停止循环,请使用条件断点。另外,了解您的Arc版本以及这些版本可以使用的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.