2017-09-07 1 views
2

Ich versuche, ein Python-Skript zu schreiben, die 1) kompiliert eine cpp-Datei. 2) Liest eine Textdatei "Input.txt", die in die cpp-Datei eingegeben werden muss. 3) Vergleichen Sie die Ausgabe mit der Datei "Output.txt" und Drucken Sie "Pass", wenn alle Testfälle erfolgreich bestanden haben, sonst drucken Sie "Fail". `Übergabe von Stdin für cpp-Programm mit einem Python-Skript

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) 

`

Für den obigen Code, ich bin eine Ausgabe wie diese bekommen,

(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 Code enthält die Nummer von der "zu erhöhen Input.txt "von 2.

Antwort

0

übergeben Sie stattdessen die Zeichenfolge an communicate, und öffnen Sie Ihre Datei als Binärdatei (sonst Python 3 wird es nicht mögen/Sie müssen Ihre Zeichenfolge als 012 codieren):

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) 

auch nicht konvertieren Eingabe der Datei integer. Lassen Sie es als Zeichenfolge (ich vermute, Sie müssen jedoch leere Zeilen ausfiltern)

+0

Hey, Vielen Dank! Es funktionierte. Gibt es einen besonderen Grund dafür, die Datei als Binärdatei anstatt als direkte Zeichenkette zu öffnen, abgesehen von der Tatsache, dass python3 das so will? – Gautam

+0

wie in der Antwort erklärt, nein (und das ist frustrierend, weil wir hier nur mit Text umgehen). Erwägen Sie, die Antwort als akzeptiert zu markieren, wenn dies für Sie funktioniert. –