Mục tiêu: Hiển thị dữ liệu từ máy chủ trong GUI wxPython trên máy kháchTail -f đăng nhập vào máy chủ, xử lý dữ liệu, sau đó phục vụ cho khách hàng thông qua twisted
Người mới đến Xoắn. Tôi có một GUI wxPython chạy trên một máy khách Windows 7, và tôi có một chương trình đang chạy trên một máy chủ Ubuntu để tạo ra một bản ghi. Nỗ lực hiện tại của tôi là kết nối nhật ký, đưa đầu ra đến một máy chủ bị xoắn, sau đó phục vụ bất kỳ dữ liệu nào đáp ứng các điều kiện regex của tôi cho máy khách. Tôi đã có một đường hầm mở, vì vậy tôi không cần phải phức tạp với SSH. Tôi đã nhận được khối mã sau đang chạy, nhưng nó chỉ phục vụ dòng đầu tiên trong đầu vào. Tôi biết tôi cần phải tiếp tục kiểm tra đầu vào cho một dòng mới và sau đó ghi nó vào vận chuyển, nhưng tôi không chắc chắn làm thế nào để làm điều đó mà không vi phạm kết nối.
Tôi chưa thể tìm đủ thông tin để vá một giải pháp đầy đủ với nhau. Tôi cũng đã thử các phương pháp khác nhau bằng cách sử dụng ổ cắm và tập tin IO, nhưng tôi nghĩ Twisted có vẻ là một công cụ tốt cho vấn đề này. Có phải tôi đang trên đường ray bên phải không? Bất kỳ đề xuất nào được đánh giá cao. Cảm ơn
#! /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()
Để trả lời nhận xét đầu tiên, tôi cũng đã thử đọc nhật ký từ bên trong Python, chương trình bị treo. Mã sau:
#! /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()
Bạn đã xem xét đọc nhật ký từ bên trong python, chứ không phải là đường dẫn đầu ra từ 'đuôi'? – Velociraptors
Đã cố gắng để làm việc này cũng như sử dụng một máy phát điện, chương trình treo cứng. Dường như với tôi rằng việc vận chuyển và máy phát điện đang chờ người khác kết thúc. Mã được hiển thị ở trên. Có cách nào tốt hơn để làm điều này hơn bằng cách sử dụng một máy phát điện? – jsucsy