Приложение Python, использующее Twisted, перестает работать после выхода пользователя Windows XP - PullRequest
4 голосов
/ 13 марта 2012

Я унаследовал проект с использованием библиотеки Twisted Python. Приложение завершает работу после выхода пользователя Windows XP.

Код Python был преобразован в исполняемый файл с использованием bbfreeze. Кроме того, сгенерированный bbfreeze исполняемый файл зарегистрирован в качестве службы Windows с использованием instsrv.exe и srvany.exe.

Я взял простой пример чата с веб-сайта Twisted и создал исполняемый файл из bbfreeze и зарегистрировал его с помощью instsrv и srvany, и возникает та же проблема: исполняемый файл прекращает работу после выхода пользователя из системы.

Я склонен думать, что что-то в Windows XP и библиотеке Twisted вызывает завершение или остановку приложения. В частности, я думаю, что это может быть что-то в коде реактора, что приводит к остановке работы кода приложения. Однако я не смог подтвердить это.

Кто-нибудь еще видел это или есть идеи о том, что может быть причиной этого?

Спасибо, Mark

1 Ответ

2 голосов
/ 13 марта 2012

Судя по «, я также могу воспроизвести это с помощью простого примера чата », виновным является Twisted. Люди в Интернете сообщают, что Twisted сервисы иногда отказывают таким образом: Re: SIGBREAK для windows .

Twisted имеет внутреннюю функцию регистрации. Примером его использования является ответ на Запутанный запуск / остановка фабрики / протокола без шумных сообщений журнала . Если бы вы использовали его, вы бы уже увидели сообщение « полученный SIGBREAK ... », указывающее на основную причину.


Кстати, я использую приведенный ниже код для регистрации необработанных исключений в моих скриптах. Это всегда хорошая идея, если сценарий должен запускаться без присмотра (или другими лицами, для которых вы диагностируете проблемы: ^)).

# set up logging #####################################
import sys,os,logging
logfile = os.path.splitext(os.path.basename(sys.argv[0]))[0]+".log"
logging.basicConfig(\
    format='%(asctime)s %(levelname)-8s %(message)s',\
    filename=logfile,\
    level=logging.DEBUG)
l = logging.getLogger()
#to avoid multiple copies after restart from pdb prompt
if len(l.handlers)<=1: l.addHandler(logging.StreamHandler(sys.stdout))
#hook to log unhandled exceptions
def excepthook(type,value,traceback):
    logging.exception("Unhandled exception occured",exc_info=(type,value,traceback))
    old_excepthook(type,value,traceback)
old_excepthook = sys.excepthook
sys.excepthook = excepthook
# ####################################################
...