Python交错子进程的stdin/stdout,类似于终端



我正在为学生作业写一个自动评分器。一些任务是编写从STDIN读取并打印到STDOUT的程序。

目前,我的分级器在一个批次中传递输入,然后将所有STDOUT作为一个批次读取(impl:我使用subprocess.run(..., input="bluen7n".encode(), capture_output=True)(。

然而,当向学生提供反馈时,将STDOUT和STDIN交错会更有帮助,就像他们在终端上运行程序时所经历的那样。

因此,对于一个要求颜色和数字的程序,我目前可以将STDIN和STDOUT表示为:

STDIN

blue
7

标准输出

name a color: pick a number: nice choices :)

但我想在测试运行后显示的是:

name a color: blue
pick a number: 7
nice choices :)

这是一个已解决的问题吗?如果没有,我可以将现有的哪些工具组合在一起来实现这一点?在SO/谷歌30分钟的研究中,我发现有很多方法可以处理子流程通信,所以我希望有人能为我指明最有成效的方向。

Charles Duffy的评论,以及对另一个问题的回答中的信息,让我了解当前的解决方案。

我没有通过Popen(或衍生工具(运行学生提交,而是使用runpy.run_path:以编程方式调用它

runpy.run_path(script_name, _globals, '__main__')

这使我可以像运行__main__一样运行脚本,就像从终端运行一样。

我用自定义版本的inputprint设置了_globals,以便截获这些调用并记录活动。此外,我在_globals中重写sys.argv,以具有用于提交的模拟参数。

通过截取input,我既可以断言打印了正确的提示,也可以提供适当的响应。

Extra:为了简化测试,我编写了一个类,加载一个预期的对话框,然后运行提供的脚本,并断言每个inputprint都遵循预期的对话框。

最终结果可以在byu pytest utils/io_checker.py 中找到

最新更新