У меня есть серверный скрипт, который мне нужно для корректного завершения работы. При тестировании обычных try..except
утверждений я понял, что Ctrl-C
работает не так, как обычно. Обычно я бы обернул долго выполняющиеся задачи, как это
try:
...
except KeyboardInterrupt:
#close the script cleanly here
чтобы задача могла быть корректно завершена на Ctrl-C
. Я никогда не сталкивался с какими-либо проблемами с этим прежде, но каким-то образом, когда я нажимаю Ctrl-C
, когда этот конкретный скрипт запускается, скрипт просто завершает работу без перехвата Ctrl-C
.
Первоначальная версия была реализована с использованием Process
из multiprocessing
. Я переписал скрипт, используя Thread
из threading
, но та же проблема там. Я использовал threading
много раз прежде, но я новичок в библиотеке multiprocessing
. В любом случае, я никогда не сталкивался с таким поведением Ctrl-C
.
Обычно я всегда использовал часовые и т. Д. Для упорядоченного закрытия экземпляров Queues
и Thread
, но этот скрипт просто завершается без ответа.
Наконец, я попытался переопределить signal.SIGINT
так же, как это
def handler(signal, frame):
print 'Ctrl+C'
signal.signal(signal.SIGINT, handler)
...
Здесь Ctrl+C
фактически было перехвачено, но обработчик не выполняется, он никогда ничего не печатает.
Помимо аспекта threading
/ multiprocessing
, части скрипта содержат C++
SWIG
объектов. Я не знаю, имеет ли это какое-либо отношение к этому. Я использую Python 2.7.2 на OS X Lion.
Итак, несколько вопросов:
- Что здесь происходит?
- Как я могу отладить это?
- Что мне нужно выучить, чтобы понять основную причину?
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: внутренняя часть скрипта проприетарна, поэтому я не могу привести примеры кода. Однако я очень хочу получать указатели, чтобы я мог отладить это сам. Я достаточно опытен, чтобы понять, может ли кто-нибудь указать мне правильное направление.
РЕДАКТИРОВАТЬ: Я начал комментировать импорт и т. Д., Чтобы увидеть, что вызвало странное поведение, и я сузил его до импорта C++ SWIG
библиотеки. Есть идеи, почему импортировать библиотеку C++ SWIG
'украдет' Ctrl-C
? Однако я не автор виновной библиотеки, и мой опыт работы с SWIG ограничен, поэтому я не знаю, с чего начать ...
РЕДАКТИРОВАТЬ 2: Я только что попробовал тот же сценарий на машине с Windows, и в Windows 7 Ctrl-C
перехватывается, как ожидалось. Я не собираюсь беспокоиться по поводу части OS X, скрипт все равно будет работать в среде Windows.