如何在ArcMap的Python窗口中手动中断语句执行?


20

如何在ArcMap的Python控制台中中断长时间运行的进程的执行?

例如,一旦开始,您如何打乱像下面这样的长时间迭代?

for i in range(1, 50):
  # some long process which takes over a minute to complete

我想在运行控制台窗口中输入的代码时按键盘组合键,单击按钮或类似操作以随时停止该过程。


1
打破是指强迫它退出吗?
RK 2012年

@RK:是的,我想在任何时候强制它退出,因为我(1)看到了不希望的输出,(2)输入了错误的处理顺序,(3)任何其他原因。
Alex Essilfie 2012年

2
刚刚检查了可能的键盘快捷键。Ctrl + Z,Ctrl + C和ESC都不起作用。您可能需要使用IDLE或其他IDE来完成所需的工作。
RK 2012年

在Windows机器的lx终端中使用ctrl + Z

@anurag:谢谢您的建议,但这不是我想要的。我想要的是停止在ArcMap中的Python窗口内执行,而不使用IDE或Terminal。我已经知道如何在终端或IDE中终止执行。
Alex Essilfie

Answers:


14

刚刚测试过,ESC 也不起作用。ArcGIS只是冻结了片刻,然后继续。一旦在ArcGIS Python控制台中运行它,似乎没有办法强制退出它。您也无法使用任务管理器将其杀死,因为Python进程未显示在此处。

如果您确实希望能够强制退出它,则可以考虑使用IDLE之类的IDE,而不是在ArcGIS Python控制台中进行操作。例如,在IDLE中,可以使用Ctrl+ ZCtrl+ C终止执行。


1
由于ArcGIS 10.X窗口无法执行的技术限制,ArcGIS Pro Python窗口可让您在执行时停止Python代码。
Jason Scheirer'3

9

这是我使用的方法:

  • 创建一个名为kill_processx.py的小型python脚本
  • 运行时,kill_processx将创建一个名为stop_processx.txt的小型测试文件。
  • 在主程序中循环的顶部或底部检查是否存在stop_processx.txt。
  • 如果确实存在,请执行所需的任何清理例程,然后正常停止。
  • 删除stop_processx.txt文件

kill_processx.py文件的示例:

import os 
nameof_killfile="stop_processx.txt"

if os.path.exists(nameof_killfile): 
    os.remove(nameof_killfile) 
else:
    killit=open(nameof_killfile,"w") 
    killit.close()

您称为“ kill_processx.py”的脚本是什么?
亚伦

1
kill_process脚本只会在正确的文件夹中创建一个空的txt文件,并带有正确的名称。
mhoran_psprep 2012年

您能否在您的帖子中包括一个示例脚本,以便我们更好地了解这对OP的问题有何帮助?
亚伦

@mhoran_psprep:我接受了RK的回答,因为它回答了问题(除非在IDE中,否则是不可能的)。解决方法+1。我想我会在将来实现它。
Alex Essilfie 2012年

4

使用蛮力策略强制关机是一种不好的做法。相反,正如@Aragon指出的那样,您应该在脚本中添加错误处理以隔离组件和/或在不满足某些条件的情况下停止脚本。正如@RK指出的那样,ArcGIS python控制台对于运行复杂脚本几乎是一文不值,实际上,应保留用于简单操作-坚持使用IDLEpythonwinpyscripter或任何其他其他IDE。以下是与您的问题相关的讨论:

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

终止Python脚本

如何在Python中停止命令或提示?


1
当然,使用像PyScripter这样的IDE,您只需在“ for ... range”语句中添加“断点”,在“调试模式”下运行脚本,IDE会自动在同一位置“暂停”在迭代过程中指出问题,并允许您检查已处理的结果。
RyanDalton 2012年

2

我在10.4中工作,发现在此处输入图片说明在脚本运行时可以单击关闭X。ArcMap将询问我是否要取消操作。

在此处输入图片说明

我单击是。然后,ArcMap在退出前询问我是否要保存。我单击取消。该脚本引发键盘中断。


您单击哪个关闭按钮以触发此操作顺序?
Alex Essilfie

大多数(所有?)Windows软件的右上角的Windows红色X。看到我的答案中的小图片。
埃米尔·布伦迪奇

1

如果要以pythonic方式解决,请尝试以下操作:

import sys
sys.exit()

或使用:

raise SystemExit()

详细:

import time
import sys

sTime= time.time()

if time.time() - sTime > 60:
   sys.exit()

我希望它可以帮助您...


不,这不是我想要的。我想在运行控制台窗口中输入的代码的同时按键盘组合键,单击按钮或类似操作以随时停止该过程。我知道,sys.exit()但是当循环或类似的长进程正在运行时,这将不起作用。
Alex Essilfie 2012年

@Upvoters:不是我要的答案。它没有回答我的问题。我想通过按键盘组合或单击按钮或类似操作来破坏语句(通常是迭代)的执行。
Alex Essilfie 2012年

1

至少在ArcMap 10.4中,您可以执行此操作。确保“结果”窗口可见。(如果未在“地理处理”下找到它)。现在,如果您正在运行命令,它将显示在此窗口中。右键单击它,然后按“取消”。



0

使用IDLE,我有一个名为“ stop.py”的文件,其中包含单行:“ pass”。在运行另一个.py脚本时,请在IDLE中将此文件保持打开状态。在“ stop.py”窗口中单击F5将重置IDLE。

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.