Como interromper manualmente a execução de instruções na janela Python do ArcMap?

20

Como se quebra a execução de um processo de longa execução no console python do ArcMap?

Por exemplo, como você interrompe uma iteração longa como a abaixo, uma vez iniciada?

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

Quero interromper o processo a qualquer momento pressionando uma combinação de teclado, clicando em um botão ou algo semelhante enquanto o código que eu inseri na janela do console estiver em execução .

Alex Essilfie
fonte
1
Por pausa, você quer dizer que você quer forçá-lo a sair?
RK
@RK: Sim, quero forçá-lo a sair a qualquer momento, porque (1) vi uma saída indesejada, (2) inseri a ordem de processamento incorreta, (3) por qualquer outro motivo.
Alex Essilfie
2
Apenas verifique os possíveis atalhos do teclado. Ctrl + Z, Ctrl + C e ESC não funcionam. Pode ser necessário usar o IDLE ou outro IDE para realizar o que você deseja.
RK
use ctrl + Z no terminal lx para a máquina windows
@anurag: Obrigado por sua sugestão, mas não é isso que desejo. O que eu quero é interromper a execução dentro da janela Python no ArcMap, sem usar um IDE ou um Terminal. Eu já sei como encerrar a execução em um terminal ou IDE.
Alex Essilfie

Respostas:

14

Apenas testei e ESC também não funciona. O ArcGIS congela por um momento e depois continua. Não parece haver uma maneira de forçar o encerramento, uma vez que é executado no console do ArcGIS Python. Você não pode matá-lo usando o Gerenciador de Tarefas, pois o processo Python não aparece lá.

Se você realmente deseja forçar o encerramento, considere usar um IDE como IDLE em vez de fazê-lo no console do ArcGIS Python. No IDLE, por exemplo, você pode usar Ctrl+ Zou Ctrl+ Cpara finalizar a execução.

RK
fonte
1
A janela do ArcGIS Pro Python permite interromper o código Python durante a execução, devido a limitações tecnológicas que a janela do ArcGIS 10.X não pode.
Jason Scheirer
9

Este é o método que eu uso:

  • crie um pequeno script python chamado kill_processx.py
  • Quando executado, kill_processx cria um pequeno arquivo de teste chamado stop_processx.txt.
  • Na parte superior ou inferior do loop no programa principal, verifique se o stop_processx.txt existe.
  • Se existir, execute as rotinas de limpeza necessárias e pare normalmente.
  • Exclua o arquivo stop_processx.txt

exemplo de um arquivo 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()
mhoran_psprep
fonte
Qual é o script que você chama de "kill_processx.py"?
Aaron
1
o script kill_process apenas cria um arquivo txt vazio com o nome correto na pasta correta.
Mhoran_psprep 20/12/12
Você poderia incluir um exemplo de script em sua postagem, para que possamos ter uma idéia melhor de como isso pode ajudar na pergunta do OP?
Aaron
@mhoran_psprep: Aceitei a resposta de RK porque ela responde à pergunta (não é possível, a menos que esteja em um IDE). +1 para sua solução alternativa. Acho que vou implementá-lo no futuro.
Alex Essilfie
4

É uma prática ruim forçar o desligamento usando táticas de força bruta. Em vez disso, como o @Aragon apontou, você deve adicionar tratamento de erros ao seu script para isolar componentes e / ou interromper o script se determinadas condições não forem atendidas. Como o @RK aponta, o console python do ArcGIS é praticamente inútil para a execução de scripts complexos e, na prática, deve ser reservado para operações simples - fique com o IDLE , pythonwin , pyscripter ou qualquer outro host de outros IDEs. Aqui estão as discussões relacionadas à sua pergunta:

Como uso o sys.exit (0) em um script arcpy para sair mais cedo sem que seja exibida uma mensagem de erro?

Terminando um script Python

Como parar um comando ou prompt no Python?

Aaron
fonte
1
E, é claro, com um IDE como o PyScripter, você pode simplesmente adicionar um "ponto de interrupção" na sua instrução "for ... range", executar o script no "modo de depuração", e o IDE automaticamente "pausará" ao mesmo apontar durante o processo iterativo e permitir que você inspecione os resultados que já foram processados.
RyanKDalton-OffTheGridMaps
2

Estou trabalhando na versão 10.4 e descobri que posso clicar no X próximo insira a descrição da imagem aquienquanto um script está em execução. O ArcMap perguntará se eu quero cancelar uma operação.

insira a descrição da imagem aqui

Eu clico em Sim. O ArcMap então me pergunta se eu quero salvar antes de sair. Eu clico em Cancelar. O script lança uma interrupção no teclado.

Emil Brundage
fonte
Em qual botão fechar você clica para acionar essa sequência de ação?
Alex Essilfie
O Windows vermelho X no canto superior direito da maioria dos softwares do Windows (todos?). Veja a pequena foto na minha resposta.
Emil Brundage
1

Se você deseja resolver de maneira pitônica, tente o seguinte:

import sys
sys.exit()

ou use:

raise SystemExit()

em detalhe:

import time
import sys

sTime= time.time()

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

espero que ajude você ...

Aragão
fonte
Não, não é isso que eu quero. Quero interromper o processo a qualquer momento pressionando uma combinação de teclado, clicando em um botão ou em algo semelhante enquanto o código que eu inseri na janela do console estiver em execução . Estou ciente, sys.exit()mas isso não funciona quando um loop ou um processo similarmente longo está em execução.
Alex Essilfie
@ Uppoters: esta não é a resposta que estou procurando. Não responde a minha pergunta . Quero interromper a execução de uma instrução (normalmente iteração) pressionando uma combinação de teclado ou clicando em um botão ou algo semelhante.
Alex Essilfie
1

Pelo menos no ArcMap 10.4, você pode fazer isso. Verifique se a janela "Resultados" está visível. (Se não o encontrar em "Geoprocessamento"). Agora, se você tiver um comando em execução, ele será exibido nesta janela. Clique com o botão direito e pressione "Cancelar".

H.Durham
fonte
0

Usando o IDLE, tenho um arquivo chamado "stop.py" que contém a única linha: "pass". Mantenha esse arquivo aberto no IDLE enquanto outro script .py estiver em execução. Clicar em F5 na janela "stop.py" redefine o IDLE.

nbcaldon
fonte