3

私は私の学生(私は家庭教師)のためのコードチェッカーに取り組んでいます。プロジェクトは、printキーワードを使用して特定の文字列を出力する関数を作成することです。彼らが印刷したものを保存してリスト(または同様のもの)と照合することで、印刷したものをテストできるようにしたいと考えています。基本的なセットアップは次のとおりです。

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

このchecker関数のどこかで、印刷されたものを追跡できるようにしたいと考えています。Javascriptでは、次のようなことができました:

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

学生のコードを実行すると、コンソールに出力する代わりに、値が にプッシュされlogsます。Python 2.7 でも同じことを実現したいと考えています。

4

3 に答える 3

7

に別のファイルのようなオブジェクトを割り当てることができますsys.stdout。印刷されるものはすべてそのオブジェクトに書き込まれます。

io.BytesIO()オブジェクトを使用して置き換えることができますstdout:

import sys
from io import BytesIO

orig_stdout, sys.stdout = BytesIO()

ioは、Python 3 のより新しく、より堅牢な I/O ライブラリであり、Python 2 でも利用できます。io.BytesIO()のより堅牢なバージョンですStringIO.StringIO()

sys.stdout.getvalue()その後、 ;を呼び出して出力された内容を調べることができます。完了したら、から復元できますorig_stdout

デモ:

>>> 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'

sys.stdout以前の参照から復元したことに注意してください。他に;を置き換えるものがなければsys.__stdout__、も使用できます。現在指しているものへの参照を保存する方が安全です。sys.stdoutsys.stdout

于 2013-08-08T21:26:34.550 に答える
0

Java で行っていることに相当する Python はsys.stdout、カスタムのファイルのようなオブジェクトに置き換えることです。

もちろん、これは彼らが何をキャッチするだけではありませんprintsys.stdout.writeまた、それらの内容、または設定に応じて、logging.log実行するサブプロセスの出力などもキャッチします。ただし、print置換できる関数ではないため、実際にはそれを回避する方法はありません。(もちろん、代わりに 3.x を教えた場合、それは別の話になります。)


ただし、これをまったく行わない方がおそらく簡単です。Python の外部から stdout をキャプチャするだけです。例えば:

for student in student??.py:
    python ${student} > ${student}.out

または、どうしてもという場合は、subprocessPython 内で同じことを行います。

output = {student: subprocess.check_output('{}.py'.format(student)) 
          for student in students}

(おそらく、例外をキャッチして隠しておくものでラップしたいと思うでしょうが、アイデアを得るにはそれで十分です。)

于 2013-08-08T21:26:40.423 に答える