2013-08-20 25 views
2

我有我的Mac上使用非標準lybraries(在我的情況下,OpenCV的庫)一個C++代碼,需要這樣編譯這一點,可以從其他被稱爲電腦(至少從其他的Mac電腦)。從python運行。所以我有3個基本問題:調用C++函數,從Python腳本,在Mac OSX

  1. 如何編譯我的項目,以便它可以從python使用?我讀過 ,我應該創建一個* .so文件,但如何做?
  2. 它應該像一個庫一樣工作,所以python調用一些特定的功能, 在python級別選擇?
  3. 還是應該包含從 命令行執行的主要功能?

如何做到這一點任何想法? PS:我正在使用Eclipse IDE來編譯我的C++項目。

乾杯,

+3

您是否考慮過SWIG接口生成器? http://www.swig.org/ IT將C/C++代碼作爲.so文件包裝爲Python代碼,您可以直接從Py調用這些C/C++函數。 – atmaere

回答

1

如果你使用Linux,atmaere和nouney的答案可能爲你工作。

就我而言,當我使用MacOSX時,我想通過使用cython庫的方式。一個簡單的教程,使事情的工作描述如下:

如何從Python腳本調用C++:

  1. INSTALL用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. PREP是C++源文件:確保你的* .cpp和* .h文件是正確的。在所下載的例子中,文件名是cpp_rect.h和cpp_rect.cpp

  4. CREATE PYTHON WRAPER CPLASS:根據在所下載的實例或在http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html?highlight=cpp#create-cython-wrapper-class

  5. 描述的模型準備的rectangle.pyx文件SETUP.PY FILE:下載的例子已經計算在這個文件中,但更多的信息可以在本教程中找到:http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html?highlight=cpp#specify-c-language-in-setup-py。 [PS:1最簡單的編譯方法是使用setup.py文件在disutilis軟件包中進行編譯。有關編譯選項的信息,請訪問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:沒有這樣的文件或目錄」 U能砍旗系統做sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2。比重複上一步。

  8. 測試您的代碼:在這個組件中,您可以獲得所需的一切:setup.py與rectangle.pyx一起使用以生成rectangle.so文件,這是我們需要的!只需構建一個pythons腳本來測試你的集成。幸運的是,這個例子已經包含了一個名爲use_rect.py的測試腳本。

現在剛剛從終端使用「$ python userect.py

+1

+1。 – atmaere

1

如何編譯我的項目,所以它可以從Python的使用?我讀過 ,我應該創建一個* .so文件,但如何做?

這取決於你的編譯器。舉例相剋++: g++ -shared -o myLib.so myObject.o

它應該像一個lib,所以Python調用一些特定的功能, 選擇在蟒蛇的水平?

是的,在我看來。看起來確實是「明顯」的方式,因爲它對模塊化和C++代碼的發展非常有用。

1

下面是使用SWIG一個例子:

的Python代碼它調用C++函數 「流入」:

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++代碼y在此步驟中試圖綁定的名稱與命令中給出的 不同。否則它會被swig代碼覆蓋。

比方說example_wrap.cpp是你想用Python和「example.i」接口的文件是SWIG接口文件。 SWIG將生成一個名爲example.cpp的新文件。

2)痛飲-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。

想法是編譯的模塊名稱應該以下劃線開頭,後面跟着名稱。

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" 
+0

您好atmaere,我在步驟4得到以下錯誤:「架構x86_64的未定義符號:'_PyArg_ParseTuple',引用:_teste_swigregister in teste.o」 任何想法? – marcelosalloum

+0

您的C++代碼中有一個語言錯誤,很可能。確保您可以在接口之前成功編譯C++代碼(您將需要一個main.cpp文件)。 SWIG調試消息不是很清楚。 – atmaere

+0

顯然,當我在Mac上運行它時,-shared選項不可用。相反,我應該使用-dynamiclib或-bundle,根據http://stackoverflow.com/questions/1494407/undefined-symbol-main-when-trying-to-build-shared-library-g-mac – marcelosalloum

0
  1. 運行它,我想你應該採取boost python一看,這是一個驚人的圖書館,也適用於Linux,Windows和Mac電腦。使用boost python,你可以導出你的類和函數,以便直接從python訪問它們。有很多很多的例子,文檔非常好!

  2. 使用boost python,您應該定義您想要公開哪些函數/類,並且它們將您的源代碼編譯爲要在python中導入的庫文件。

+0

感謝雨果,但我已經做出了工作,但將在未來嘗試您的解決方案 – marcelosalloum