与 Python cmd 模块交互

Interaction with Python cmd module

我有一个使用 cmd 模块的程序,如下所示:

import cmd


class Prog(cmd.Cmd):

    prompt = '>>'

    def do_reverse(self, line):
        print line[::-1]

    def do_exit(self, line):
        return True

if __name__ == '__main__':
    Prog().cmdloop()

我想以编程方式写入程序 stdin 并从其 stdout 中读取。我正在尝试通过以下方式实现这一点:

from subprocess import Popen, PIPE


class ShellDriver(object):
    def __init__(self, process):
        self.process = process
        self.prompt = '>>'
        self.output = ''
        self.read()

    def read(self):
        while not self.output.endswith(self.prompt):
            chars = self.process.stdout.read(1)
            if chars == '':
                break
            self.output += chars

        result = self.output.replace('\n' + self.prompt, '')
        self.output = ''
        return result

    def execute(self, command):
        self.process.stdin.write(command + '\n')
        return self.read()

if __name__ == '__main__':
    p = Popen(['python', 'prog.py'], stdin=PIPE, stdout=PIPE)
    cmd = ShellDriver(p)
    print cmd.execute('reverse abc')
    cmd.execute('exit')

然而,当我 运行 来自 PyCharm 的这段代码时它工作正常,但是当我从命令行 运行 它时它挂起。据我所知,控制台之间存在冲突(reader 脚本来自 运行 的控制台和程序控制台),因为它们试图使用相同的管道,并且 [=29] 中不存在此问题=] 因为它将 I\O 重定向到它自己的控制台。

有没有办法让它在系统控制台中运行?

我在 Windows(最好是跨平台解决方案)和 Python 2.7

终于找到答案了。默认情况下,解释器以缓冲模式工作,将数据分块发送到标准输出,以避免在非缓冲模式下使用 -u 命令行参数 运行:

p = Popen(['python', '-u', 'prog.py'], stdin=PIPE, stdout=PIPE)