Как изящно выйти из приложения, запущенного с помощью twistd?

У меня есть jabber-клиент, который читает со своего стандартного ввода и отправляет сообщения PubSub. Если я получаю EOF на stdin, я хочу завершить работу клиента.

Сначала я попробовал sys.exit () , но это вызывает исключение, и клиент не выходит. Затем я немного поискал и обнаружил, что мне следует вызвать response.stop () , но я не могу выполнить эту работу. Следующий код в моем клиенте:

from twisted.internet import reactor
reactor.stop()

приводит к исключениям.AttributeError: 'module' объект не имеет атрибута 'stop'

Что мне нужно сделать, чтобы twistd закрыл мое приложение и завершил работу?

РЕДАКТИРОВАТЬ 2

Первоначальная проблема была вызвана некоторыми символическими ссылками, мешающими импорту модуля. После исправления этой проблемы я получаю новое исключение:

twisted.internet.error.ReactorNotRunning: Can't stop reactor that isn't running.

После исключения twistd закрывается. Я думаю, это может быть вызвано вызовом MyClient.loop в MyClient.connectionInitialized . Может, мне нужно отложить вызов на потом?

РЕДАКТИРОВАТЬ

Вот файл .tac для моего клиента

import sys

from twisted.application import service
from twisted.words.protocols.jabber.jid import JID

from myApp.clients import MyClient

clientJID = JID('client@example.com')
serverJID = JID('pubsub.example.com')
password = 'secret'

application = service.Application('XMPP client')
xmppClient = client.XMPPClient(clientJID, password)
xmppClient.logTraffic = True
xmppClient.setServiceParent(application)

handler = MyClient(clientJID, serverJID, sys.stdin)
handler.setHandlerParent(xmppClient)

, который я вызываю с помощью

twistd -noy sentry/myclient.tac < input.txt

Вот код для MyClient:

import os
import sys
import time
from datetime import datetime

from wokkel.pubsub import PubSubClient

class MyClient(PubSubClient):
    def __init__(self, entity, server, file, sender=None):
        self.entity = entity
        self.server = server
        self.sender = sender
        self.file = file

    def loop(self):
        while True:
            line = self.file.readline()
            if line:
                print line
            else:
                from twisted.internet import reactor
                reactor.stop()

    def connectionInitialized(self):
        self.loop()
12
задан lawnsea 17 March 2011 в 21:47
поделиться