我有一个 jabber 客户端,它正在读取其标准输入并发布 PubSub 消息。如果我在标准输入上得到 EOF,我想终止客户端。
我第一次尝试sys.exit()
,但这会导致异常并且客户端不会退出。然后我做了一些搜索,发现我应该打电话reactor.stop()
,但我无法完成这项工作。我的客户端中的以下代码:
from twisted.internet import reactor
reactor.stop()
结果是exceptions.AttributeError: 'module' object has no attribute 'stop'
我需要做什么才能让twistd 关闭我的应用程序并退出?
编辑 2
最初的问题是由一些符号链接弄乱了模块导入引起的。解决该问题后,我得到了一个新异常:
twisted.internet.error.ReactorNotRunning: Can't stop reactor that isn't running.
异常发生后,twistd 关闭。我认为这可能是由调用MyClient.loop
in引起的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()