我在这里找到了文档、邮件列表和这个问题之间的部分答案,但我想得到一个更直接的答案来解决我的具体问题......
我正在通过尝试一点一点地包装我已经在使用的库的小部分来学习 cython,该库目前包装在 boost::python 中。我为这个 boost 包装器贡献了一点点,并将它用作 c++ 参考,同时我使用ZeroMQ Python 绑定作为 cython 参考。
我的问题是关于项目结构的。这个 lib 的当前 boost 版本编译为单个.so
,这就是我的目标。我很快发现你不能直接将多个.pyx
模块编译成一个.so
. 然后我开始沿着cppclass
在文件中定义 's的路线pxd
,以及它们相应的 python 导出的实现类 in .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 项目采用的模式是将公共对象收集到一个位置,然后与源定义一个 1 对 1 的标头定义,然后有一个巨大的包装器将所有定义收集到一个位置。以及添加的自定义异常处理和实用程序。