通过tornado.proces.Subprocess调用xtail

时间:2015-09-15 03:55:42

标签: python subprocess tornado

如何通过import subprocess from tornado.ioloop import IOLoop from tornado import gen from tornado import process class Reader(object): def __init__(self, xwatch_path, max_idle=600, ioloop=None): self.xwatch_path = xwatch_path self.ioloop = ioloop self.max_idle = max_idle @gen.coroutine def call_subprocess(self, cmd, stdin_data=None, stdin_async=False): stdin = STREAM if stdin_async else subprocess.PIPE sub_process = process.Subprocess( cmd, stdin=stdin, stdout=STREAM, stderr=STREAM, io_loop=self.ioloop ) if stdin_data: if stdin_async: yield gen.Task(sub_process.stdin.write, stdin_data) else: sub_process.stdin.write(stdin_data) if stdin_async or stdin_data: sub_process.stdin.close() result, error = yield [ gen.Task(sub_process.stdout.read_until, '\n'), gen.Task(sub_process.stderr.read_until, '\n') ] print result raise gen.Return((result, error)) @gen.coroutine def popen(self): while True: result, error = yield self.call_subprocess(['xtail', self.xwatch_path]) print result, error def read_log(ioloop): access_reader = AccessLogReader( '/home/vagrant/logs') ioloop.add_callback(access_reader.popen) def main(): ioloop = IOLoop.instance() read_log(ioloop) ioloop.start() if __name__ == '__main__': main() 致电~/log/123.txt

{{1}}

我想在日志文件夹中收集一些日志更改,准备使用xtail多个文件夹来收集日志,然后我开发用于调试的环境。

我使用Vim修改{{1}}文件,但我看不到输出。

1 个答案:

答案 0 :(得分:2)

声明

result, error = yield [
    gen.Task(sub_process.stdout.read_until, '\n'),
    gen.Task(sub_process.stderr.read_until, '\n')
]

读取进程的一行标准输出和一行标准错误,并阻塞直到它读取了两行。如果xtail仅写入两个流中的一个,则永远不会完成。

您可能想要循环阅读(请注意,gen.Task不是必需的):

@gen.coroutine
def read_from_stream(stream):
    try:
        while True:
            line = yield stream.read_until('\n')
            print(line)
    except StreamClosedError:
        return

如果您关心stdout和stderr之间的区别,请单独阅读它们。这将在每个流到达时打印行,并在两个流关闭时停止:

yield [read_from_stream(sub_process.stdout), read_from_stream(sub_process.stderr)]

如果您没有,请在创建子流程时通过传递stdout=STREAM, stderr=subprocess.STDOUT来合并它们,并且只读取sub_process.stdout。