如何在arcpy脚本中使用sys.exit(0)提前退出而不显示错误消息?


13

我有一个用于ArcGIS 10.0的arcpy工具脚本,该脚本包含两个主要的功能部分。用户可以选择是否运行第二部分。如果用户选择不运行第二部分,我只想运行清理功能并使用sys.exit(0)退出脚本,而不会在工具结果窗口中发布错误消息。 GIS-SE中有两个主要线程与退出arcpy脚本有关,但是其中的解决方案并未专门解决错误消息。该代码的一般结构如下:

import sys
##import arcpy

def CleanUp():
    print 'Cleaning up ...\n'

def finish():
    CleanUp()
    print 'Exiting ...'
    sys.exit(0)

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...\n'

if not do_more:
    finish()

#Section 2:  do more stuff
print 'doing more stuff ...'
CleanUp()

如果我在ArcGIS / arcpy之外的Python解释器中运行此代码,则它会按我的预期工作,并且正常退出且没有错误消息;但是,在具有相同结构的arcpy脚本中,该脚本会退出,但是SystemExit错误消息会发布到工具结果窗口中。有没有一种方法可以使arcpy工具脚本吃掉异常并掩埋SystemExit错误消息?


只是在这里采取了疯狂的手段,但是在脚本中调用SystemExit之前,您是否有可能“ del arcpy”?

@Dan-我对此表示怀疑,但这是一个有趣的主意……嗯……到底是什么。我会旋转的。
celticflute 2011年

1
感谢您发布简洁的代码示例,该示例清楚地说明了逻辑并省略了其他功能。+1
马特·威尔基,

Answers:


8

简短答案:已在10.1中修复。现在,您将需要增加一个缩进级别。不过,这可能会鼓励对代码进行一些有用的重构。每当在单个脚本/例程中获得大量行时,您都将要考虑将其分成更小的部分(函数,类)。

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass

谢谢,杰森。是的,我应该硬着头皮进行重构。要让客户屏住呼吸,很难做到这一点。这就是人生。
celticflute 2011年

3

ArcPy 弄乱了您的Python环境。简而言之,要么不执行sys.exit(),要么在调用sys.exit()之前查找/调用arcpy的“ cleanup-before-exit”(如果存在)函数。


2
Python可执行文件的处理方式sys.exit()是一种肮脏的技巧-调用exit会引发SystemExit异常,而通常会打印回溯信息的顶级解释器将检测到异常类型并终止解释器。将Python解释器嵌入到另一个应用程序(例如ArcGIS系列可执行文件)中,需要大量的特定于实现的代码,例如这样。
詹森·谢勒

2

我不知道如何“掩埋” SystemExit错误消息,但是您始终可以重组代码以避免调用sys.exit

import sys
##import arcpy

def DoMoreStuff():
    print 'doing more stuff ...'

def CleanUp():
    print 'Cleaning up ...'

def finish():
    CleanUp()
    print 'Exiting ...'

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...'

if do_more:DoMoreStuff()

finish()

是的,但是我的arcpy脚本中的两个部分相当庞大。我宁愿不要再创建缩进级别,而不得不处理随之而来的范围界定问题……但是,是的,这将是一个解决方案。真正令人沮丧的是,错误消息仅在arcpy中使用sys.exit时出现。在普通的Python中,该消息不会发布,因为SystemExit异常不被视为错误。
celticflute 2011年
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.