在Mac OSX上从Python脚本调用c ++函数

时间:2013-08-20 18:33:30

标签: c++ python c opencv compilation

我的mac上的c ++代码使用了非标准的lybraries(在我的情况下,OpenCV libs)并且需要编译它以便可以从其他计算机(至少从其他mac计算机)调用它。从python运行。所以我有3个基本问题:

  1. 如何编译我的项目,以便可以从python中使用它?我读了 我应该创建一个* .so文件,但该怎么做?
  2. 它应该像lib一样工作,所以python调用一些特定的函数, 在python级别选择?
  3. 或者它应该包含从中执行的 main 函数 命令行?
  4. 有关如何操作的任何想法? PS:我正在使用eclipse IDE来编译我的c ++项目。

    干杯,

4 个答案:

答案 0 :(得分:2)

如果你使用linux,atmaere和nouney的答案可能适合你。

就我而言,当我使用MacOSX时,我想通过使用cython库。下面将介绍一个简单的教程:

如何从Python脚本调用C ++:

  1. 安装CYTHON:要安装Cython,将python脚本与c / c ++集成的工具,请访问:https://pypi.python.org/pypi/Cython/

  2. 下载示例:从此处下载C ++实现示例:http://wiki.cython.org/WrappingCPlusPlus?action=AttachFile&do=get&target=cythoncpp.tgz

  3. 预备C ++源文件:确保您的* .cpp和* .h文件正确无误。在下载的示例中,文件名是cpp_rect.h和cpp_rect.cpp

  4. 创建PYTHON WRAPER CPLASS:根据下载示例中的rectangle.pyx文件或http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html?highlight=cpp#create-cython-wrapper-class中描述的模型

  5. 预备SETUP.PY文件:下载的示例已经使用此文件计算,但在本教程中可以找到更多信息:http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html?highlight=cpp#specify-c-language-in-setup-py。 [PS:1最简单的编译方法是使用disutilis包,使用setup.py文件。有关编译选项的信息,请访问http://docs.cython.org/src/reference/compilation.html#

  6. 尝试编译:从源文件所在的同一文件夹转到终端。此时你已经有4个文件:cpp_rect.h,cpp_rect.cpp,rectangle.pyx和setup.py。从那里,执行命令$ python setup.py build_ext --inplace

  7. 如果您收到g ++错误,例如它发生在我身上:“无法执行gcc-4.2:没有这样的文件或目录”你可以破解执行sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2的标志系统。比重复上一步。

  8. 测试你的代码:在这个问题上,你有你需要的一切:setup.py和rectangle.pyx一起使用来生成rectangle.so文件,这就是我们需要的东西!只需构建一个pythons脚本来测试您的集成。幸运的是,该示例已经使用名为use_rect.py的测试脚本。

  9. 现在只需使用“$ python userect.py

    从终端运行它

答案 1 :(得分:1)

  

如何编译我的项目,以便可以从python中使用它?我读了   我应该创建一个* .so文件,但该怎么做?

这取决于你的编译器。以g ++为例: g++ -shared -o myLib.so myObject.o

  

它应该像lib一样工作,所以python调用一些特定的函数,   在python级别选择?

是的,在我看来。它似乎是“明显的”方式,因为它对于C ++代码的模块化和演变非常有用。

答案 2 :(得分:1)

以下是使用SWIG的示例:

调用C ++函数的Python代码“inflow”:

 import inflow    # importing C++ inflow library
 nframes = 25
 print 'calling inflow function in loop ...'
 for i in xrange(0,1001):
      z = inflow.inflow(""" arguments""")
     """ code does something with z """

C ++函数将照常执行:

 #include <iostream>
 #include <vector>
  inflow(/* arguments from Python*/)
  {
   /* code does something */

  }

现在要与Python接口,以下是步骤:

1)重要 - 确保您在此步骤中尝试绑定的C ++代码的名称与 在命令中给出。否则它将用swig代码覆盖。

让我们说example_wrap.cpp是你要与Python接口的文件,“example.i”是SWIG接口文件。 SWIG将生成一个名为example.cpp的新文件。

2)swig -c ++ -python -o example_wrap.cpp example.i

3)g ++ -I /usr/include/python2.7 -fPIC -c example_wrap.cpp -o example_wrap.o

4)g ++ -shared -o _example.so example_wrap.o

想法是编译的模块名称应以下划线开头,后跟名称。

5)在术语中打开Python,然后说

from example import *

然后开始调用函数。

6)来源:http://www.iram.fr/~roche/code/python/SWIG.html#purpose

示例的接口文件如下所示:

 %module example
 %{
   #include "example.h"
 %}

 %include "std_vector.i"
 // Instantiate templates used by example
 namespace std {
  %template(IntVector) vector<int>;
  %template(DoubleVector) vector<double>;
  }

  // Include the header file with above prototypes
  %include "example.h"

答案 3 :(得分:1)

  1. 我认为你应该看一下boost python,它是一个了不起的库,也适用于linux,windows和mac。使用boost python,您可以导出类和函数,以便直接从python访问它们。有很多例子,文档非常好!!!

  2. 使用boost python,你应该定义你想要公开的函数/类,然后将源代码编译成一个将在python中导入的库文件。