如何组织python / Boost Python项目

时间:2011-01-23 16:12:53

标签: c++ python organization boost-python

我有一个python项目,我希望使用Boost :: Python与一些C ++库进行交互。我想知道其他人如何在同一个项目中组织他们的python / boost :: python / C ++代码。

通过组织,我的意思是文件/目录结构,构建过程等。

2 个答案:

答案 0 :(得分:1)

在下文中,pif表示Python InterFace。首先,我有一个名为conv_pif.hpp的通用头文件,它有Boost头和C ++ Std Library头等。然后对于每个boost python模块,我有一个string_pif.cpp形式的文件(这里对应于示例模块genocpp),其中string大致对应于模块的名称。

****************************************************************************************
geno_pif.cpp
****************************************************************************************
#include "conv_pif.hpp"
#include <boost/python.hpp>
#include "geno.hpp"

void export_cppvec_conv();

void export_geno()
{
  boost::python::def("write_geno_table_affy6_to_file", write_geno_table_affy6_to_file);
}

BOOST_PYTHON_MODULE(genocpp)
{
  export_geno();
  export_cppvec_conv();
}
*****************************************************************************************

函数export_cppvec_conv对应于(模板化)转换器到/从C ++向量到python列表。我在文件cppvec_conv_pif.cpp中有实际的转换器。特别是,这定义了export_cppvec_conv,它使用模板即时化,所以我可以在不将它包含在geno_pif.cpp中的情况下离开。为了便于说明,export_cppvec_conv的内容如下所示,其中cppvec_to_python_list和cppvec_from_python_list在cppvec_conv_pif.cpp的主体中定义。

******************************************
cppvec_conv_pif.cpp (extract)
******************************************
void export_cppvec_conv()
{
  boost::python::to_python_converter<vector<double>, cppvec_to_python_list<double> >();
  cppvec_from_python_list<double>();

  boost::python::to_python_converter<vector<int>, cppvec_to_python_list<int> >();
  cppvec_from_python_list<int>();

  boost::python::to_python_converter<vector<string>, cppvec_to_python_list<string> >();
  cppvec_from_python_list<string>();
}
******************************************

可以根据genocpp模块的需要添加任意数量的转换器。 当然,我已经在geno.hpp中获得了geno函数的标题。 最后,我有一个将所有内容链接在一起的Scons文件

******************************************
Sconstruct
******************************************
#!/usr/bin/python

import commands, glob, os

# Common file, for both executables and Python Interface
common_files = """geno print"""

def pyversion():
    pystr = commands.getoutput('python -V')
    version = pystr.split(' ')[1]
    major, minor = version.split('.')[:2]
    return major + '.' + minor

common_base = Split(common_files)
common = [f + ".cpp" for f in common_base]

# For Python interface only
pif_conv = Split("cppvec_conv cppmap_conv cppset_conv")
pif_conv_files = [t+"_pif.cpp" for t in pif_conv]

pif = Split("geno")
pif_files = [t+"_pif.cpp" for t in pif]

# Boost Python Environment
boost_python_env = Environment(
    CPPPATH=["/usr/include/python"+pyversion(), "."],
    CXXFLAGS='-ftemplate-depth-100 -fPIC -Wall -Werror -pedantic -pipe -O3 -ffast-math -march=opteron',
    #CXXFLAGS='-ftemplate-depth-100 -fPIC -Wall -pedantic -O0 -g',
    CPPDEFINES=['BOOST_PYTHON_DYNAMIC_LIB'],
    LIBPATH=["/usr/lib/python"+pyversion()+"/config"],
    LIBS=["python"+pyversion(), "m", "boost_python"],
    SHLIBPREFIX="", #gets rid of lib prefix
    SHOBJSUFFIX = ".bpo"
)

boost_python_env.SharedLibrary(target='genocpp', source = common + pif_conv_files + pif_files)

在这种情况下,只有一个模块,所以pif_files只有geno_pif.cpp。否则,我会选择我想要的模块。嗯,也许在某处上传一个工作示例是最容易的。如果有人对更多细节感兴趣,我想我可以编辑这个吗?

问候,法赫姆

答案 1 :(得分:0)

我无法就此向您提供直接建议,但Gentoo的一个名为paludis的软件包管理器就是这样做的,据我所知,它的开发人员非常有能力,所以它的sources可以服务作为如何做到这一点的一个很好的例子。

但我个人会建议不要使用Boost Python。据称,与其他绑定工具(如cython,SWIG或SIP)相比,它的速度非常慢且占用大量内存。