与 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)
我有一个使用 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)