Цель: показать данные с сервера в графическом интерфейсе wxPython на клиенте
Новичок в Twisted. У меня есть графический интерфейс wxPython, запущенный на клиенте Windows 7, и есть программа, запущенная на сервере Ubuntu, которая создает журнал. В настоящее время я пытаюсь выполнить хвост -f журнала, передать вывод на сервер Twisted, а затем передать клиенту все данные, удовлетворяющие моим условиям regex. У меня уже открыт туннель, поэтому мне не нужно усложнять ситуацию с SSH. Я запустил следующий блок кода, но он обслуживает только первую строку во входных данных. Я знаю, что мне нужно продолжать проверять ввод на наличие новой строки и затем записывать ее на транспорт, но я не уверен, как это сделать без разрыва соединения.
Я не смог найти достаточно информации, чтобы собрать воедино полное решение. Я также пробовал различные другие методы, используя сокеты и файловый IO, но я думаю, что Twisted кажется хорошим инструментом для решения этой проблемы. Нахожусь ли я на правильном пути? Любые рекомендации будут приняты с благодарностью. Спасибо
#! /usr/bin/python
import optparse, os, sys
from twisted.internet.protocol import ServerFactory, Protocol
def parse_args():
usage = """usage: %prog [options]
"""
parser = optparse.OptionParser(usage)
help = "The port to listen on. Default to a random available port."
parser.add_option('--port', type='int', help=help)
help = "The interface to listen on. Default is localhost."
parser.add_option('--iface', help=help, default='localhost')
options =parser.parse_args()
return options#, log_file
class LogProtocol(Protocol):
def connectionMade(self):
for line in self.factory.log:
self.transport.write(line)
class LogFactory(ServerFactory):
protocol = LogProtocol
def __init__(self,log):
self.log = log
def main():
log = sys.stdin.readline()
options, log_file = parse_args()
factory = LogFactory(log)
from twisted.internet import reactor
port = reactor.listenTCP(options.port or 0, factory,
interface=options.iface)
print 'Serving %s on %s.' % (log_file, port.getHost())
reactor.run()
if __name__ == '__main__':
main()
Чтобы ответить на первый комментарий, я также попытался просто прочитать лог из Python, программа зависла. Code follows:
#! /usr/bin/python
import optparse, os, sys, time
from twisted.internet.protocol import ServerFactory, Protocol
def parse_args():
usage = """ usage: %prog [options]"""
parser = optparse.OptionParser(usage)
help = "The port to listen on. Default to a random available port"
parser.add_option('--port', type='int', help=help, dest="port")
help = "The logfile to tail and write"
parser.add_option('--file', help=help, default='log/testgen01.log',dest="logfile")
options = parser.parse_args()
return options
class LogProtocol(Protocol):
def connectionMade(self):
for line in self.follow():
self.transport.write(line)
self.transport.loseConnection()
def follow(self):
while True:
line = self.factory.log.readline()
if not line:
time.sleep(0.1)
continue
yield line
class LogFactory(ServerFactory):
protocol = LogProtocol
def __init__(self,log):
self.log = log
def main():
options, log_file = parse_args()
log = open(options.logfile)
factory = LogFactory(log)
from twisted.internet import reactor
port = reactor.listenTCP(options.port or 0, factory) #,interface=options.iface)
print 'Serving %s on %s.' % (options.logfile, port.getHost())
reactor.run()
if __name__ == '__main__':
main()