繁体   English   中英

如何使用子进程有效地测试基于readline的Python程序?

[英]How can I effectively test my readline-based Python program using subprocesses?

我有一个Python程序,在某些条件下,应该提示用户输入文件名。 但是,我想提供一个默认文件名,用户可以根据需要进行编辑。 这通常意味着他们需要点击退格键来删除当前文件名并将其替换为他们喜欢的文件名。

为此,我将Python 3的这个答案改编成:

def rlinput(prompt, prefill=''):
    readline.set_startup_hook(lambda: readline.insert_text(prefill))
    try:
        return input(prompt)
    finally:
        readline.set_startup_hook()

new_filename = rlinput("What filename do you want?", "foo.txt")

当程序以预期的方式交互运行时 - 在退格并输入新文件名后, new_filename包含bar.txt或用户输入的任何文件名时,这可以正常工作。

但是,我还想使用单元测试来测试程序。 通常,为此,我将程序作为子进程运行,以便我可以将其输入到stdin(因此在用户使用它时对其进行测试)。 我有一些单元测试代码(简化)看起来像这样:

p = Popen(['mypythonutility', 'some', 'arguments'], stdin=PIPE)
p.communicate('\b\b\bbar.txt')

我的意图是这应该模拟用户对提供的foo.txt “退格”,并输入bar.txt

但是,这似乎没有达到预期的效果。 相反,在一些调试之后,我的程序中的new_filename最终会出现相当于\\b\\b\\bbar.txt的内容。 我只是期待bar.txt

我究竟做错了什么?

从Python控制交互式子进程的适当方法是使用pexpect模块。 此模块使子进程相信它正在交互式终端会话中运行,并允许父进程确切地确定将哪些击键发送到子进程。

Pexpect是一个用于生成子应用程序的纯Python模块; 控制他们; 并回应其产出中的预期模式。 Pexpect就像Don Libes的Expect一样。 Pexpect允许您的脚本生成子应用程序并控制它,就像人类正在键入命令一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM