2

我希望有一个Python Cmd实例在单独的线程中运行,并且能够从我的程序的其他部分写入输入和读取输出。在 Cmd 的构造函数中,可以指定 stdin(default: sys.stdin) 和 stdout(default sys.stdout)。我期待我可以使用StringIO模块进行读写,但 Cmd 只是读取初始字符串,到达 EOF 并退出。我需要与 sys.stdin 相同的行为,因此 readline() 将阻塞,直到有输入要读取。

我做了这门课,它可以按我的意愿工作:

import Queue

class BlockingLineIO():
    def __init__(self):
        self.closed = False
        self.queue = Queue.Queue()
        self.remainder = ""

    def write(self, s):
        for line in s.splitlines(True):
            if not line.endswith("\n"):
                self.remainder = line
            elif line != "":
                self.queue.put(self.remainder + line)
                self.remainder = ""

    def read(self):
        if self.queue.empty() and self.closed:
            return ""
        else:
            self.queue.put(False)
            return "".join(list(iter(self.queue.get, False)))

    def readline(self):
        if self.queue.empty() and self.closed:
            return ""
        else:
            return self.queue.get()

    def flush(self):
        pass

    def close(self):
        self.queue.put("")
        self.closed = True


def main():
    import cmd, threading
    my_cmd_class = type("Foo", (cmd.Cmd, object),
                        {'do_EOF': lambda self, line: self.stdout.write("Bye.\n") == None})
    my_cmd = my_cmd_class(stdin=BlockingLineIO(), stdout=BlockingLineIO())
    my_cmd.use_rawinput = False
    my_cmd.prompt = ""
    cmd_loop = threading.Thread(target=my_cmd.cmdloop)
    cmd_loop.start()
    my_cmd.stdin.write("help\n")
    print my_cmd.stdout.readline()
    print my_cmd.stdout.read()
    my_cmd.stdin.close()
    cmd_loop.join()
    print my_cmd.stdout.read()


if __name__ == '__main__':
    main()

问题:

以上是实现我需要的正常方式吗?是否有任何标准类可用于管道标准输入和标准输出?我觉得我错过了一些东西。

4

0 回答 0