使用Python脚本传递stdin用于cpp程序

时间:2017-09-07 09:02:11

标签: c++ python-3.x

我正在尝试编写一个python脚本 1)编译cpp文件。 2)读取必须馈送到cpp文件的文本文件“Input.txt”。 3)将输出与“Output.txt”文件进行比较,如果所有测试用例都成功通过则打印“通过”,否则打印“失败”。 `

 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”中的数字增加2的代码。

1 个答案:

答案 0 :(得分:0)

将字符串传递给communicate,然后将文件作为二进制文件打开(否则python 3赢了,它/你必须将你的字符串编码为bytes):

 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)

也不要将文件的输入转换为整数。把它留作字符串(我怀疑你不得不过滤出空行)