Затмение + Pydev:Функции “очистки” не вызываются при нажатии “стоп”"?

StackOverflow https://stackoverflow.com/questions/1261597

  •  12-09-2019
  •  | 
  •  

Вопрос

Пытаюсь запустить этот файл в eclipse

class Try:
   def __init__(self):
       pass
   def __del__(self):
       print 1
a=Try()
raw_input('waiting to finish')

и нажатие кнопки stop без завершения работы программы не выводит "1", т.е. метод del никогда не вызывается.Если я попытаюсь запустить скрипт из командной строки и нажму ctrl-c \ sys.exit, "1" действительно печатается, т.е. вызывается del.То же самое, если я попытаюсь использовать wait():

class A:

    def __enter__(self):
        return None
    def __exit__(self, type, value, traceback):
        print 3


with A():
    print 1
    raw_input('Waiting')
    print 2

Если я нажму "стоп" при появлении запроса, "3" не будет напечатано

Почему это так?Есть ли способ обойти это?

Спасибо, Ноам

Это было полезно?

Решение

Нажатие кнопки stop в Eclipse сразу же убивает интерпретатор (хотя на самом деле он довольно часто выходит из строя).Нравится использовать kill/taskkill, процесс не осознает своей кончины.

Ctrl+C фрагмент из Википедии...

Control-C как команда прерывания была популяризирована UNIX и принята в других системах.В системах POSIX последовательность приводит к тому, что активная программа получает сигнал SIGINT.Если программа не указывает, как обрабатывать это условие, она завершается.Обычно программа, которая обрабатывает SIGINT, все равно завершает себя или, по крайней мере, завершает задачу, запущенную внутри нее.

Ctrl+C является управляющим сигналом для прерывания работы программы, но, как вы, возможно, заметили в середине этого абзаца, программы могут указывать, как обрабатывать сигнал.В Python нажмите Ctrl+C генерирует исключение KeyboardInterrupt который обычно перехватывается, а затем Python завершает работу чисто.Даже если вы убиваете переводчика с помощью Ctrl+C он может обработать это так, чтобы очистить окружающую среду перед выходом.

Я включил следующее, потому что вы спросили: "Есть ли способ обойти это?"

Если вы хотите остановиться на raw_input(...) звонки, которые вы могли бы использовать Ctrl+Z чтобы отправить EOF.Я огляделся по сторонам, и, похоже, нет никакого способа отправить Ctrl+C/0x03 к сожалению, в Eclipse.

Другие советы

Документы Python:

__del__(self)

Вызывается, когда экземпляр собирается быть уничтожен.Это также называется деструктором.Если базовый класс имеет __del__() метод, производный класс __del__() метод, если таковой имеется, должен явно вызвать его, чтобы обеспечить правильное удаление части экземпляра базового класса.Обратите внимание, что это возможно (хотя и не рекомендуется!) __del__() метод, позволяющий отложить уничтожение экземпляра путем создания новой ссылки на него.Затем его можно вызвать позже, когда эта новая ссылка будет удалена. Не гарантируется, что __del__() методы вызываются для объектов, которые все еще существуют на момент выхода интерпретатора.

Если вы хотите гарантировать, что метод будет вызван, используйте с-заявление

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top