gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:41:27 31 4
gpt4 key购买 nike

我在文档、邮件列表和 this question here 之间找到了部分答案。 ,但我想得到一个更直接的答案来解决我的具体问题......

我正在学习 cython,方法是尝试一点一点地包装我已经在使用的库的小部分,该库目前包装在 boost::python 中。我为这个 boost 包装器贡献了一点点,并将它用作 c++ 引用,同时我正在使用 ZeroMQ Python bindings作为 cython 引用。

我的问题是关于项目结构的。这个库的当前 boost 版本编译为单个 .so,这就是我的目标。我很快发现你不能直接将多个 .pyx 模块编译为单个 .so。然后我开始在 pxd 文件中定义 cppclass 的路线,并在 .pxi 中定义它们对应的 python 导出实现类,并且试图将它们包含在单个 pyx 中进行编译。虽然它一开始是有效的,但当我再写一点时,我遇到了多个定义冲突的问题,因为 pxi 包含在不同的地方。

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

  • 将公共(public)类命名为与 cppclass 相同(我现在通过将 cppclass 放在不同的命名 pyd 中并使用导入的命名空间来处理类似的名字,阿拉Using cimport to resolve naming conflicts)
  • 单个 .so 作为编译输出 (acceptable approach?)
  • 我是单独在主 pyx 中使用 pyx 多包含方法,还是应该主 pyx 包含除此之外的任何其他内容只是持有包含?
  • 在哪里集中定义将在 python 中导出的常量?
  • 是否有首选的文件夹结构?现在,我在 setup.py 下的一个大 src 目录中拥有所有内容。看到这么多 pxi、pxd、pyx 文件会让人感到困惑。
  • 现在完全不需要pxi了吗?如果没有,我是否需要使用 cython 样式的 ifndef 保护来处理不同模块之间的多个包含?
  • 我知道 ZeroMQ python 绑定(bind)构建多个模块并通过 __init__.py 包含它们来使用包方法。这真的是 cython 的正确方法吗?

作为引用,我正在练习重新包装的项目是PyOpenNI (openni)。这个 boost 项目采用的模式是将公共(public)对象收集在一个地方,然后与源定义一个 1 对 1 的 header 定义,然后有一个巨大的包装器将所有定义收集到一个位置。以及添加的自定义异常处理和实用程序。

最佳答案

在等待一个明确的答案时,我一直在组织我的代码。到目前为止,将 pyx 文件包含在单个 pyx 中进行编译的工作一直有效。

我的 setup.py 很简单:

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

主要的openni.pyx看起来像:

include "constants.pyx"
include "exceptions.pyx"
include "context.pyx"
...

我有一个通用的 libopenni.pxd 来为其余模块提供仅声明的外部。

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

xncontext.pxd

cdef extern from "XnCppWrapper.h" namespace "xn":
cdef cppclass Context:
...

context.pyx:

from libopenni cimport *
from xncontext cimport Context as c_Context

cdef class Context:
cdef c_Context *handle
...

关于c++ - 用于将 cython 中的许多 c++ 类包装到单个共享对象的项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11698482/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com