2016-09-06 7 views
1

私は入力ファイルと予想される出力ファイルのリストを持っています。私は、入力ファイルでそれを実行し、Pythonプログラムを受け入れるという仕事をする自動グレーダーを書いて、その出力を出力ファイルと比較します。私が使用しているアプローチは、os.system('python program.py > actual.out')を使用してプログラムを実行し、os.system()を使用して出力とexpected.outの間でdiffを実行するために、osのpythonモジュールを使用する方法です。開発とオートグレーダーのpythonテスト戦略

私が現在直面している問題は、与えられたプログラムがコンソールからの読み込みであるため、ファイルから入力を読み込むことです。ですから、どのように入力をファイルからリダイレクトすれば、program.pyのsys.stdinが読むことができますか?

import os 
def grade(program_py_file_handler,input_dir,output_dir): 
    #create temporary file for program.py using program_py_file_handler 
    #one by one read all files from input_dir 
    #run program.py using os.system generating a temp file 
    #do diff be temp file and expected file 

diffコマンドを使用せずにdiffを実行するより良い方法はありますか?

出力をprogram.pyからファイルにリダイレクトするには、python program.py>tem.outを使用しました。 program.pyでsys.stdinを使用したときに、渡されたファイルから読み込むように、入力ファイルをprogam.pyにリダイレクトするために使用するものは何ですか?

+1

試したコードはどこですか? – pzp

答えて

0

実質的にsubprocessをスピンアップし、期待される出力に対してdiffを実行するので、組み込みモジュールを使用してPython 3.3以降ですべてを実行できます。シンプル最小例:あなたが合うよう

check.py

import sys 
from subprocess import check_output 
from difflib import ndiff 

def split(s): 
    return s.splitlines(keepends=True) 

def check(program_name, expected): 
    output = check_output([sys.executable, program_name]).decode('utf8') 
    diff = ndiff(split(output), split(expected)) 
    print(''.join(diff), end="") 

def main(): 
    check('hello.py', 'Good Morning!\n') 

if __name__ == '__main__': 
    main() 

hello.py

print('Good Evening!') 

例は、他の方法で、変更

$ python check.py 
- Good Evening! 
?  ^^^ 
+ Good Morning! 
?  ^^^ 

を実行しますライブラリの関数lインクで塗られている。サブプロセスにstdinが必要な場合は、Popenオブジェクトを作成して通話する必要がありますが、ドキュメントを先に参照して後で参照できるようにしてください。

関連する問題