我正在尝试编写一个 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 的代码。
最佳答案
改为将字符串传递给 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)
也不要将文件的输入转换为整数。将其保留为字符串(不过我怀疑您必须过滤掉空行)
关于c++ - 使用 Python 脚本为 cpp 程序传递标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46092169/