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 .


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.


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()

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?


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.


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ê ...


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".



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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.