Как вручную прервать выполнение оператора в окне Python ArcMap?

20

Как можно прервать выполнение длительного процесса в консоли Python ArcMap?

Например, как прервать длинную итерацию, подобную приведенной ниже, после ее запуска?

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

Я хочу остановить процесс в любое время, нажимая комбинацию клавиш, нажимая кнопку или что-то подобное, пока выполняется код, введенный мной в окне консоли .

Алекс Эссильфи
источник
1
Под перерывом ты имеешь в виду заставить тебя бросить?
РК
@RK: Да, я хочу заставить его выйти в любое время, потому что я (1) увидел нежелательный вывод, (2) ввел неправильный порядок обработки, (3) любую другую причину.
Алекс Эссильфи
2
Только что проверил возможные сочетания клавиш. Ctrl + Z, Ctrl + C и ESC не работают. Возможно, вам придется использовать IDLE или другую IDE, чтобы выполнить то, что вы хотите.
РК
используйте ctrl + Z в терминале lx для windows machine
@anurag: Спасибо за ваше предложение, но это не то, чего я хочу. Я хочу остановить выполнение внутри окна Python в ArcMap, не используя IDE или Terminal. Я уже знаю, как прекратить выполнение в терминале или IDE.
Алекс Эссильфи,

Ответы:

14

Просто проверил и ESC не работает. ArcGIS просто на мгновение зависает, а затем продолжается. Кажется, не существует способа принудительно завершить его, когда он запустится в консоли ArcGIS Python. Вы не можете убить его с помощью диспетчера задач, так как процесс Python там не отображается.

Если вы действительно хотите иметь возможность принудительно завершить его, вы можете рассмотреть возможность использования IDE, такой как IDLE, а не делать это в консоли Python ArcGIS. Например, в IDLE вы можете использовать Ctrl+ Zили Ctrl+ Cдля прекращения выполнения.

RK
источник
1
Окно ArcGIS Pro Python позволяет вам останавливать код Python во время его выполнения из-за технологических ограничений, которые не дает окно ArcGIS 10.X.
Джейсон Шейрер
9

Это метод, который я использую:

  • создайте небольшой скрипт на python с именем kill_processx.py
  • При запуске 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()
mhoran_psprep
источник
Какой скрипт вы называете kill_processx.py?
Аарон
1
Сценарий kill_process просто создает пустой текстовый файл с правильным именем в правильной папке.
mhoran_psprep
Не могли бы вы включить пример сценария в ваше сообщение, чтобы мы могли лучше понять, как это может помочь с вопросом ОП?
Аарон
@mhoran_psprep: Я принял ответ РК, потому что он отвечает на вопрос (это невозможно, если только в IDE). +1 за ваш обходной путь. Я думаю, что я буду реализовывать это в будущем.
Алекс Эссильфи
4

Плохо практиковать принудительное отключение, используя тактику грубой силы. Скорее, как указал @Aragon, вы должны добавить обработку ошибок в ваш скрипт, чтобы изолировать компоненты и / или остановить скрипт, если определенные условия не выполняются. Как указывает @RK, Python-консоль ArcGIS практически бесполезна для запуска сложных сценариев и на практике должна быть зарезервирована для простых операций - придерживайтесь IDLE , pythonwin , pyscripter или любого другого хоста других IDE. Вот обсуждения, связанные с вашим вопросом:

Как я могу использовать sys.exit (0) в скрипте arcpy для досрочного выхода без появления сообщения об ошибке?

Завершение скрипта Python

Как остановить команду или приглашение в Python?

Аарон
источник
1
И, конечно же, с помощью IDE, такой как PyScripter, вы можете просто добавить «точку останова» в свой оператор «for ... range», запустить скрипт в «режиме отладки», и среда IDE автоматически «остановится» в тот же момент. укажите во время итеративного процесса и позволит вам проверить результаты, которые уже были обработаны.
RyanKDalton-OffTheGridMaps
2

Я работаю в 10.4, и я обнаружил, что могу нажать кнопку закрытия X введите описание изображения здесьво время выполнения скрипта. ArcMap спросит меня, хочу ли я отменить операцию.

введите описание изображения здесь

Я нажимаю Да. ArcMap затем спрашивает меня, хочу ли я сохранить перед выходом. Я нажимаю Отмена. Скрипт выдает прерывание клавиатуры.

Эмиль Брундейдж
источник
На какую кнопку закрытия вы нажимаете, чтобы запустить эту последовательность действий?
Алекс Эссильфи
Windows red X в правом верхнем углу большинства (всех?) Программ Windows. Смотрите маленькую картинку в моем ответе.
Эмиль
1

если вы хотите решить с помощью питона, попробуйте это:

import sys
sys.exit()

или используйте:

raise SystemExit()

в деталях:

import time
import sys

sTime= time.time()

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

я надеюсь, что это поможет вам ...

Арагон
источник
Нет, это не то, что я хочу. Я хочу остановить процесс в любое время, нажимая комбинацию клавиш, нажимая кнопку или что-то подобное, пока выполняется код, введенный мной в окне консоли . Я знаю, sys.exit()но это не работает, когда выполняется цикл или аналогичный процесс.
Алекс Эссильфи
@ Upvoters: это не тот ответ, который я ищу. Это не отвечает на мой вопрос . Я хочу прервать выполнение оператора (обычно итерации) нажатием комбинации клавиш или нажатием кнопки или чего-то подобного.
Алекс Эссильфи
1

По крайней мере, в ArcMap 10.4 вы можете сделать это. Убедитесь, что окно «Результаты» видно. (Если не найти его в разделе «Геообработка»). Теперь, если у вас есть запущенная команда, она появится в этом окне. Щелкните правой кнопкой мыши по нему и нажмите «Отмена».

H.Durham
источник
0

Что делать, если под каждой строкой кода вы добавляете ifпроверку, if input()=="what ever you want in here"которая использует sys.exit.

Например: https://repl.it/@kquazi_tcsp/JumpyNaturalMetadata

Кайран Квази
источник
Надеюсь, это поможет.
Кайран Квази
0

Используя IDLE, у меня есть файл с именем «stop.py», который содержит одну строку: «pass». Держите этот файл открытым в режиме IDLE, пока выполняется другой скрипт .py. Нажатие F5 в окне «stop.py» сбрасывает IDLE.

nbcaldon
источник