【问题标题】:How to use Python to input to and get output from C++ program?如何使用 Python 输入和获取 C++ 程序的输出?
【发布时间】:2020-12-22 12:01:22
【问题描述】:

我目前正在尝试自动化 C++ 程序的测试,该程序从终端获取输入并将结果输出到终端。例如,我的 C++ 文件会执行如下操作:

#include <iostream>

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

我用于测试的 Python 文件如下:

as = [1, 2, 3, 4, 5]
bs = [2, 3, 1, 4, 5]
results = []

for i in range(5):
    # input a[i] and b[i] into the C++ program
    # append answer from C++ program into results

虽然可以通过文件 I/O 从 C++ 输入和输出,但我宁愿让 C++ 程序保持不变。

除了 Python 程序中被注释掉的行,我还能做什么?

【问题讨论】:

    标签: python c++ testing io


    【解决方案1】:

    您可以使用subprocess.Popen。示例代码:

    #include <iostream>
    
    int sum(int a, int b) {
        return a + b;
    }
    
    
    int main ()
    {
        int a, b;
    
        std::cin >> a >> b;
        std::cout << sum(a, b) << std::endl;
        
    }
    
    from subprocess import Popen, PIPE
    
    program_path = "/home/user/sum_prog"
    
    p = Popen([program_path], stdout=PIPE, stdin=PIPE)
    p.stdin.write(b"1\n")
    p.stdin.write(b"2\n")
    p.stdin.flush()
    
    result = p.stdout.readline().strip()
    assert result == b"3"
    

    【讨论】:

      【解决方案2】:
      python_program.py | cpp_program
      

      在命令行将python_program.py的标准输出输入cpp_program的标准输入。

      这适用于所有可执行文件,无论它们是用什么编程语言编写的。

      【讨论】:

      • 我认为问题不在于如何将 python 脚本的输出提供给 cpp 应用程序。乔治似乎正试图将值输入 cpp 应用程序并检查预期的输出。
      【解决方案3】:

      您可以通过 .txt 进行通信 用你的矩阵编写 txt 并在 Python 上读取它,2 个程序不能使用相同的内存。

      其他使用 Cython 并在 Python 上编写 C++ 代码 https://github.com/cythonbook/examples/tree/master/07-wrapping-c/01-wrapping-c-functions-mt-random

      【讨论】:

        【解决方案4】:

        您可以使用 supproccess 从被调用程序中获取数据,例如 whois:

        import subprocess
        proc = subprocess.Popen(['whois', 'google.com'], stdout=subprocess.PIPE)
        data = proc.communicate()[0]
        print( data )
        

        【讨论】:

          【解决方案5】:

          您将需要使用 pythons subprocess 模块 (https://docs.python.org/2/library/subprocess.html) 来启动已编译的 C++ 应用程序并发送变量并使用 Popen.communicate() (https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate) 读取子进程的输出。

          示例代码可能如下所示:

          import subprocess
          p = subprocess.Popen(["cpp_app", stdin=subprocess.PIPE,stdout=subprocess.PIPE)
          out, _ = p.communicate(b"1 2")
          print(out, err)
          

          【讨论】:

            猜你喜欢
            • 2011-11-18
            • 1970-01-01
            • 1970-01-01
            • 2016-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-18
            • 2016-09-19
            相关资源
            最近更新 更多