2015-04-30 6 views
2

У меня есть питон скрипт (без GUI), который порождает дочерний поток, в то время как родительский поток препятствует приложение от отделки с помощью этого метода:py2app приложение работает, но Mac OS X показывает, что он не реагирует

try: 
    while True: 
     time.sleep(1) 
except (KeyboardInterrupt, SystemExit): 
    pass 
finally: 
    cleanup() 

Когда я создаю приложение из этого скрипта с py2app и запускаю его, он остается в Доке и работает как ожидалось, но когда я нажимаю правой кнопкой мыши, он показывает, что «Приложение не отвечает» (то же самое в Activity Monitor) и заканчивает его Я могу выбрать только «Force Quit», из-за чего впоследствии появляется диалог отчета о сбое.

Почему это не отвечает и, если причина в sleep(), как я могу открыть приложение без него?

ответ

3

Он отображается как «не отвечает», потому что он не отвечает. Приложение на OS X (в отличие от простого «исполняемого файла Unix»/сценария, агента или демона) должно отвечать на сообщения из операционной системы.

Обычно вы делаете это, используя Cocoa run loop. PyObjC предлагает несколько high-level helpers, которые делают его еще более простым или просто позволяют вам получить доступ к тем же методам какао, которые описываются документами Apple из Python.

Другой вариант - использовать оболочку сценария, которая запускает ваш скрипт, сохраняя при этом цикл запуска (с графическим интерфейсом или без него).

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

+0

поэтому, если меня хорошо понимают, показывая на палубе, как не отвечающий, это не значит, что он действительно не отвечает?! – Amir

+0

@Amir Нет, это действительно означает, что он не отвечает. Это не значит, что это _frozen_; он вполне может делать все, что он должен был сделать, но реагирование на сообщения от ОС просто не является частью того, что он должен был делать. – abarnert