У меня есть 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()