用于将cython中的许多c ++类包装到单个共享对象的项目结构

jdi*_*jdi 22 c++ python design-patterns cython

我在这里找到了文档,邮件列表和这个问题之间的部分答案,但我希望得到更直接的答案来解决我的具体问题......

我正在学习cython,试图一点一点地包装我已经使用的库,当前包含在boost :: python中的库.我为这个boost包装器贡献了一点点,并将它用作c ++参考,同时我使用ZeroMQ Python绑定作为cython参考.

我的问题是关于项目结构.这个lib的当前boost版本编译为单个.so,这是我的目标.我很快发现你不能直接将多个.pyx模块编译成一个.so.然后我开始沿着定义文件中的cppclass's' pxd及其相应的python导出的实现类的路径.pxi,并试图将它们包含在单个文件中pyx进行编译.虽然它最初起作用,但是一旦我写了一点,我就会因为pxi包含在不同的地方而遇到多个定义冲突的问题.

我很想听到一个适当的组织方法来解决以下问题和目标:

  • 将公共类命名为cppclass(我现在通过将cppclass放在不同的命名中pyd并使用导入的命名空间来处理类似的名称,ala 使用cimport来解决命名冲突)
  • 单个.so作为编译输出(可接受的方法?)
  • 单独使用pyx多包含方法进入主要方法pyx,还是主要pyx包含除了包含包含之外的其他内容?
  • 在哪里集中定义将在python中导出的常量?
  • 是否有首选的文件夹结构?现在我把所有东西src放在我的下面一个大目录中setup.py.看到这么多pxi, pxd, pyx文件会让人感到困惑.
  • pxi现在完全没有必要?如果没有,我是否需要使用cython风格的ifndef防护来处理不同模块之间的多个包含?
  • 我知道ZeroMQ python绑定构建了多个模块,并通过包含它们来使用包方法__init__.py.这真的是cython的正确方法吗?

作为参考,我正在练习重新包装的项目是PyOpenNI(openni).此boost项目采用的模式是在一个地方收集公共对象,然后使用源定义一对一的头定义,然后有一个巨大的包装器将所有定义收集到单个位置.还有添加的自定义异常处理和实用程序.

jdi*_*jdi 21

在等待确定答案的同时,我一直在组织我的代码.到目前为止,将pyx文件包含在单个文件中pyx进行编译.

setup.py很简单:

ext_modules = [
    Extension(
        "openni", 
        ["src/openni.pyx"], 
        language="c++",
        include_dirs=['src/', '/usr/include/ni'],
        libraries=['OpenNI'],
    )
],
Run Code Online (Sandbox Code Playgroud)

主要openni.pyx看起来像:

include "constants.pyx"
include "exceptions.pyx"
include "context.pyx"
...
Run Code Online (Sandbox Code Playgroud)

我有一个共同点libopenni.pxd,就是为其他模块提供仅包含声明的externs.

我将cppclass声明pxd命名为与pyx类定义不同的名称以避免名称冲突:

xncontext.pxd

cdef extern from "XnCppWrapper.h" namespace "xn":
    cdef cppclass Context:
           ...
Run Code Online (Sandbox Code Playgroud)

context.pyx:

from libopenni cimport *
from xncontext cimport Context as c_Context 

cdef class Context:
    cdef c_Context *handle   
        ...
Run Code Online (Sandbox Code Playgroud)

  • 嘿.因此,这不是最终公开回购的任何内容.我最近这个结构的大多数例子都不在线,但这是我在此之后不久做的一个:https://github.com/chadmv/plow/tree/master/lib/python/src (2认同)
  • 我现在所做的是将pxi文件保存在include子目录中以使其保持干净.我只有它上面的主要单个pyx以及包含绑定到C/CPP的所有extern声明的pxd (2认同)