2010-01-30 104 views
5

我需要打包現有的C++庫以用於Python。在通過this answer on choosing an appropriate method to wrap C++ for use in Python閱讀後,我決定使用Py ++。使用由Py ++生成的代碼作爲Python擴展

我走過tutorial for Py++,使用教程文件,我得到了預期的輸出generated.cpp,但我還沒有想出怎麼辦才能實際使用生成的代碼作爲擴展我可以在Python中導入。我確定我現在必須編譯代碼,但是用什麼?我應該用bjam

+0

你見過這是來自Py ++作者的公告? http://mail.python.org/pipermail/cplusplus-sig/2009-January/014198.html – torial 2010-01-30 23:46:34

+0

我有,但它仍然在回答我的問題之前結束:「最後一步 - 代碼生成。」我認爲最後一步應該使用編譯和導入的代碼,而不是僅僅生成代碼。 – gotgenes 2010-01-31 16:17:04

回答

6

Py ++生成您使用的語法以及boost :: python在您的應用程序中生成python入口點。 假設Py ++一切正常,您需要下載Boost框架,並將boost include目錄和boost :: python lib添加到您的項目中,然後使用Py ++生成的cpp進行編譯。

您可以使用任何您想要的項目構建系統,但boost是使用bjam構建的。您需要選擇是否需要靜態庫或動態提升python lib,然後按照說明構建提升here

如果在Windows上,您需要將.dll的生成庫的擴展名更改爲.pyd。是的,它需要是一個圖書館項目,這不適用於可執行文件。

然後,將pyd放置在您的機器上的python可以找到它並進入python並執行import [Your-library-name]並希望一切都可以工作。

最後一個音符,這個宏generated.cpp定名爲:

BOOST_PYTHON_MODULE(-name-) 

需要在你的項目的確切名稱,否則蟒蛇會抱怨。

我剛剛在不到一個月的時間裏經歷了所有這些,所以我對混淆有所瞭解。

在構建庫和測試時,我做了一件使我的python擴展非常容易使用的事情,就是在我的構建環境中構建boost :: python和python。這樣,pyd就完全取決於我想要的地方,而用戶不需要安裝python來運行我的擴展。儘管如此,這可能是過分的。

編輯: 如果你希望你的擴展在機器上易於安裝和編譯,請查看python的setuptools。只需幾行簡單的代碼,你就可以爲你編譯和安裝你的軟件包。其中一個缺點是它不適合那些喜歡在Visual Studio中開發的人。

3

以下回答是由我提供的Roman Yakovenko on the Python C++-sig mailing list;爲了Stack Overflow社區的利益,我在這裏發佈了它,並做了少量修改。

我還沒有完全理解答案,但我覺得它指向了正確的方向。


生成代碼後,您必須進行編譯。爲此,您可以使用您最喜愛的構建系統。我只使用bjam來編譯boost。在此之後,我更喜歡使用scons(在Windows和Linux上)。

以下是sconstruct文件,它是用於編譯PY ++單元測試中的一個(這是產生的代碼太:-))的一個例子:

import sys 
env = Environment() 

if 'linux' not in sys.platform: 
    env['MSVS'] = {'VERSION': ''} 
    env['MSVS_VERSION'] = '' 
    Tool('msvc')(env) 

t = env.SharedLibrary(
    target=r'abstract_classes', 
    source=[r'/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp/abstract_classes.cpp'], 
    LIBS=[r"boost_python"], 
    LIBPATH=[r"", r"/home/roman/include/libs"], 
    CPPPATH=[ 
     r"/home/roman/boost_svn", 
     r"/usr/include/python2.6", 
     r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp", 
     r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/data", 
     r"/home/roman/boost_svn" 
    ], 
    CCFLAGS=[ ], 
    SHLIBPREFIX='', 
    SHLIBSUFFIX='.so' 
) 

由於代碼發生器Python編寫,則可以在Py ++停止的地方繼續並生成你最喜歡的「make」文件。你甚至可以去做父親。 Py ++測試生成代碼,編譯,加載新模塊並測試功能。所有這些都是在一個獨立的過程中完成的。

1

我寫了一個小的makefile有以下幾點:

GNUmakefile:

PYTHON_INC=$(shell python-config --includes) 
PYTHON_LIBS=$(shell python-config --libs) 
BOOST_LIBS=-lboost_python 

all: 
    g++ -W -Wall $(PYTHON_INC) $(PYTHON_LIBS) $(BOOST_LIBS) -fPIC -shared generated.cpp -o hw.so 

再裝創建的。所以到IPython中發揮與它周圍:

In [1]: import hw 
In [2]: a = hw.animal('zebra') 
In [3]: a.name() 
Out[3]: 'zebra'