2017-09-07 2 views
2

私はpythonスクリプトを書こうとしています 1)cppファイルをコンパイルします。 2)cppファイルに入力する必要があるテキストファイル "Input.txt"を読み込みます。 3)出力を "Output.txt"ファイルと比較し、すべてのテストケースが正常に終了した場合は "Pass"を出力し、それ以外の場合は "Fail"を出力します。上記のコードの場合 Pythonスクリプトを使ってcppプログラムのstdinを渡す

`

`

import subprocess 
from subprocess import PIPE 
from subprocess import Popen 
subprocess.call(["g++", "eg.cpp"]) 
inputFile = open("input.txt",'r') 
s = inputFile.readlines() 
for i in s : 
    proc = Popen("./a.out", stdin=int(i), stdout=PIPE) 
    out = proc.communicate() 
    print(out) 
は、私が

(b'32769', None) 
(b'32767', None) 
(b'32768', None) 
Traceback (most recent call last): 
    File "/home/zanark/PycharmProjects/TestCase/subprocessEg.py", line 23, in <module> 
    proc = Popen("./a.out", stdin=int(i), stdout=PIPE) 
ValueError: invalid literal for int() with base 10: '\n' 

PS、このような出力を取得しています: - eg.cppから番号をインクリメントするコードが含まれています」 Input.txt "を入力してください。

答えて

0

代わりにcommunicateに文字列を渡し、ファイルをバイナリとして開きます(そうしないと、python 3はそれを好まないでしょう/あなたの文字列を012としてエンコードする必要があります):

with open("input.txt",'rb') as input_file: 
    for i in input_file: 
    print("Feeding {} to program".format(i.decode("ascii").strip()) 
    proc = Popen("./a.out", stdin=PIPE, stdout=PIPE) 
    out,err = proc.communicate(input=i) 
    print(out) 

も整数にファイルの入力を変換しません。文字列として残してください(空白行を除外する必要があると思われます)

+0

ありがとう、ありがとうございます!出来た。 python3がそれを望んでいるという事実から離れて、直接のStringではなくBinaryとしてファイルを開くための特別な理由はありますか? – Gautam

+0

答えに説明されているように、いいえ(ここではテキストしか扱えないので、それは不愉快です)。これがあなたのためにうまくいけば、回答を受け入れたものとしてマークすることを検討してください。 –

関連する問題