Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中调用可执行文件并获取输出的最佳方法_Python - Fatal编程技术网

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

在python中调用可执行文件并获取输出的最佳方法,python,Python,首先用一个简单的例子来说明情况。首先是已编译为可执行文件的source.cpp: #include <iostream> using std::cout; using std::endl; int main() { cout << "Hello World!" << endl; return 0; } 因此,对于调用可执行文件并从标准输出返回输出来说,这很好。问题是,是否有任何可行的方法来执行此操作以返回潜在的大型阵列?据我所知,这基本

首先用一个简单的例子来说明情况。首先是已编译为可执行文件的source.cpp:

#include <iostream>

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

int main() 
{
    cout << "Hello World!" << endl;
    return 0;
}
因此,对于调用可执行文件并从标准输出返回输出来说,这很好。问题是,是否有任何可行的方法来执行此操作以返回潜在的大型阵列?据我所知,这基本上就像返回和读取一个文本文件,这将是相当缓慢的!虽然我知道SWIG或Cython是用C++来扩展Python的选项,但我会发现每个函数都有更为有序和模块化的单独的可执行文件。p> TLDR:您能以合理的速度将大型数组从可执行文件返回python吗?或者,使用Cython/SWIG/ctypes进行扩展是唯一的方法吗?

您有两个选择

  • subprocess.check_output或类似命令将以字符串形式返回整个程序输出
  • subprocess.popen并以增量方式读取 在第一种情况下,输出必须适合ram,否则会发生非常糟糕的事情。在第二个场景中,您可以设置缓冲区大小,然后您的子进程应该停止,直到您从缓冲区读取数据,此时它将再次继续


    cython/swig等不做任何事情来减少内存占用。如果这是内存受限的,那么您很可能希望使用python并以增量方式读/写磁盘。Python在传递内存方面非常有效(也就是说,除非你让它这么做,否则它不会进行7次内存拷贝)。

    你可以非常快地读取一个非常大的文本文件(至少是人类时间)。。。它通常是需要更长时间的处理(特别是如果矩阵太大,不能适应内存),将其放入上下文中,可执行文件的点是将一些重操作卸载到C++中,其中所需的循环将运行得更快。然后将处理后的数组返回python。数组应该足够小,以适应内存,这只是需要时间的计算。将数组从python有效地传递到python是必要的。即使作为文本块传递数组,也应该只占执行时间的一小部分。。。真的,我认为你优化过度了。。。这个数组中有多少个元素?我想我不加限制地说“大”会引起混乱。我的意思是“不小”。这将是一个实时图像处理应用程序,其中代码中的一些循环将是速度关键的,并且在C++中完成,以提高性能。对于数组大小,我将估计(640x480)。。。或者干脆在numpy做。。。我会对c和numpy之间的时间差异感到好奇(当然c更快,但实际上速度有多快,如果您担心一些cpu周期(取决于您使用numpy的一些技巧可能更快),那么为什么要使用python呢?)问题不在于内存,而在于数组应该适合内存。更重要的是,将重计算卸载到C++中,它们运行得更快,然后将数组返回到Python以供使用。这里的问题是将数组传回的速度。如果调用一个可执行文件对您来说有意义,那么管道开销并没有那么大。您还可以发送二进制数据,并使用python中的struct.unpack来处理它。如果您想直接调用C库,numpy/scipy/weave可能有助于避免编写真正的包装器。
    import subprocess
    import sys
    
    sys.path.append('C:\Foo\Bar')
    
    output = subprocess.Popen("hello_world.exe", stdout=subprocess.PIPE)
    
    print output.stdout.read()