Python 2.7跟踪已打印的内容

mar*_*st2 3 python logging python-2.7

我正在为我的学生编写代码检查员(我是导师).该项目是他们编写一个使用print关键字打印特定字符串的函数.我希望能够通过存储和匹配列表(或类似的东西)来测试他们打印的内容.基本设置是:

def checker():
    #run user code
    do some other things like save and check error messages etc
Run Code Online (Sandbox Code Playgroud)

现在,在这个checker函数的某个地方,我希望能够跟踪打印的内容.在Javascript中,我能够做到这样的事情:

var logs = [];
var hold_logger = console.log //saves the console.log so nothing gets ruined
console.log = function (x) { logs.push(x) };
Run Code Online (Sandbox Code Playgroud)

现在当我运行学生代码而不是打印到控制台时,它会将值推送到logs.我想在Python 2.7中实现同样的功能.

Mar*_*ers 7

您可以为其分配不同的类文件对象sys.stdout; 打印的任何内容都写入该对象.

您可以使用io.BytesIO()对象替换stdout:

import sys
from io import BytesIO

orig_stdout, sys.stdout = BytesIO()
Run Code Online (Sandbox Code Playgroud)

并通过调用检查打印的内容io.

演示:

>>> import sys
>>> from io import BytesIO
>>> orig_stdout, sys.stdout = sys.stdout, BytesIO()
>>> print 'Hello world!'
>>> output = sys.stdout.getvalue()
>>> sys.stdout = orig_stdout
>>> output
'Hello world!\n'
Run Code Online (Sandbox Code Playgroud)

请注意,我恢复io.BytesIO()StringIO.StringIO().您可能希望存储旧的值sys.stdout.getvalue()而将其恢复到该值以支持您的平台orig_stdout之前已经替换过的场景.