我希望有一个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()
问题:
以上是实现我需要的正常方式吗?是否有任何标准类可用于管道标准输入和标准输出?我觉得我错过了一些东西。