调用可执行文件并在python中获取输出的最佳方法

时间:2014-03-04 18:11:43

标签: python

首先举一个简单的例子来说明这种情况。首先是已编译成可执行文件的源.cpp:

#include <iostream>

using std::cout;
using std::endl;

int main() 
{
    cout << "Hello World!" << endl;
    return 0;
}

此文件已被制作成exe。现在在python中,它被调用如下:

import subprocess
import sys

sys.path.append('C:\Foo\Bar')

output = subprocess.Popen("hello_world.exe", stdout=subprocess.PIPE)

print output.stdout.read()

因此,这适用于调用可执行文件并从标准输出返回输出。问题是,是否有任何可行的方法来执行此操作以返回潜在的大型数组?从我的理解,这基本上就像返回和阅读文本文件,这将是非常慢的!虽然我知道SWIG或Cython是用C ++扩展python的选项,但我会发现每个函数的单独可执行文件更有条理和模块化!

TLDR:你能以合理的速度将大型数组从可执行文件返回到python吗?或者用Cython / SWIG / ctypes扩展是唯一的方法吗?

1 个答案:

答案 0 :(得分:1)

您有两种选择。

  1. subprocess.check_output或类似命令会将整个程序输出作为字符串
  2. 返回
  3. subprocess.popen并逐步读取。
  4. 在第一种情况下,输出必须适合ram,否则会发生非常糟糕的事情。在第二种情况下,您可以设置缓冲区大小,然后您的子进程应该暂停,直到您从缓冲区读取它将再次继续。

    cython / swig等等不做任何事情来减少内存占用。如果这是内存绑定,那么你很可能想要使用python并逐步读/写磁盘。 Python在传递内存方面非常有效(即除非你告诉它这样做,否则它不会做七十七个内存副本。)