如何将数据发送到另一个程序并获得答案?

时间:2016-11-06 14:18:08

标签: python subprocess

我想要一个python脚本,它将启动另一个程序,向它发送一些输入并获取其输出。

例如,我有这样的C ++程序:

#include <iostream>

class BigInt {
    ...
}

int main() {
    BigInt a, b;
    std::cin >> a >> b;
    std::cout << a.pow(b);
}

想要像这样使用python进行检查:

good = True

for a in range(10):
    for b in range(10):
        input = str(a) + " " + str(b)
        output, exitcode = run("cpp_pow.exe", input)   <---
        if exitcode != 0:
            print("runtime error on", input)
            print("exitcode =", exitcode)
            good = False
            break
        r = a ** b
        if output != r:
            print("wrong answer on", input)
            print(output, "instead of", r)
            good = False
            break
    if not good:
        break

if good:
    print("OK")

最简单的方法是什么?

P.S。可能更容易在python上编写相同的程序:

a, b = map(int, input().split())
print(a ** b)

通过PowerShell比较他们对许多输入的答案?

编辑:我尝试使用subprocess阅读输出:

from subprocess import Popen, PIPE
p = Popen('p.exe', stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdoutdata, stderrdata = p.communicate(input='2 1 1 2')
print(stdoutdata)

但它不起作用,我无法修复错误:

  File "test.py", line 3, in <module>
    stdoutdata, stderrdata = p.communicate(input='2 10')
  File "c:\Python33\lib\subprocess.py", line 922, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "c:\Python33\lib\subprocess.py", line 1196, in _communicate
    self.stdin.write(input)
TypeError: 'str' does not support the buffer interface

1 个答案:

答案 0 :(得分:1)

要使用subprocess模块修复错误,请将字节发送到应用程序,因为.communicate方法不接受要输入的字符串。

只需将字符串文字('')替换为字节文字(b''