我需要包装一个现有的C ++库以便在Python中使用。阅读this answer on choosing an appropriate method to wrap C++ for use in Python后,我决定使用Py ++。
我使用教程文件浏览了tutorial for Py++,我在generated.cpp
得到了预期的输出,但我还没想出要做什么才能真正使用生成的代码我可以在Python中导入的扩展。我确定我现在必须编译代码,但是用什么?我应该使用bjam吗?
答案 0 :(得分:6)
Py ++会生成您与boost :: python一起使用的语法,以在您的应用中生成python入口点。 假设Py ++的一切顺利,你需要下载Boost框架,并将boost include目录和boost :: python lib添加到你的项目中,然后使用Py ++生成的cpp进行编译。
您可以使用您想要的任何构建系统,但是使用bjam构建boost。您需要选择是否需要静态库或动态提升python库,然后按照构建boost here的说明进行操作。
如果在Windows上,则需要将构建库中的扩展名从.dll更改为.pyd。是的,它需要是一个库项目,这不适用于可执行文件。
然后,将pyd放在你机器上的python可以找到它并进入python并执行import [Your-library-name]并希望一切都能正常工作。
最后一点,这个宏中的generated.cpp中给出的名称:
BOOST_PYTHON_MODULE( -name- )
需要是项目的确切名称,否则python会抱怨。
我在不到一个月前就完成了这一切,所以我知道这种混乱。
我在构建库和测试时使我的python扩展非常容易使用的一件事是在我的构建环境中自己构建boost :: python和python。这样,pyd就会到达我想要的位置,并且用户不需要安装python就可以使用我的扩展程序运行。对你所做的事情来说,这可能有点过头了。
编辑: 如果您希望在计算机上轻松安装和编译扩展,请查看python的setuptools。只需几行简单的线条,您就可以编译python并为您安装包。但其中一个缺点是它不适合那些喜欢在visual studio中开发的人。
答案 1 :(得分:4)
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 ++测试生成代码,编译,加载新模块并测试功能。所有这些都是在一个单独的过程中完成的。
答案 2 :(得分: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
然后将创建的.so加载到ipython中来玩它:
In [1]: import hw
In [2]: a = hw.animal('zebra')
In [3]: a.name()
Out[3]: 'zebra'