2010-01-30 100 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'