目標を介してクライアントに提供しています。 Windows 7クライアントでwxPython GUIを実行していて、ログを生成するUbuntuサーバー上でプログラムを実行しています。私の現在の試みは、ログをtail -fし、出力をねじれたサーバーにパイプし、正規表現の条件を満たすデータをクライアントに提供することです。私はすでにトンネルを開いているので、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内からログを読み込もうとしましたが、プログラムがハングしました。コードは次のとおりです。
#! /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()
'tailからの出力をパイプするのではなく、Python内からログを読むことを考えましたか? – Velociraptors
ジェネレータを使用してこれも同様に処理しようとしましたが、プログラムがハングします。トランスポートとジェネレータがそれぞれもう一方が終了するのを待っているように見えます。上記のコード。ジェネレータを使用するよりも、これを行うより良い方法はありますか? – jsucsy