如何在 Cython 包装器中保留复杂的 C++ 命名空间?

How do you preserve a complex C++ namespace in a Cython wrapper?

提问人:tel 提问时间:1/12/2015 最后编辑:tel 更新时间:8/14/2022 访问量:1129

问:

我正在为一个复杂的C++库编写一个Cython包装器。我想我基本上已经弄清楚了如何编写必要的 .pxd 和 .pyx 文件。我现在的问题是,虽然我的 C++ 程序有大约 100 个单独的命名空间,但 Cython 编译的 python 库的命名空间是完全扁平的。

例如,如果我的 .pxd 文件中有这个:

cdef extern from "lm/io/hdf5/SimulationFile.h" namespace "lm::io::hdf5":
    cdef cppclass CppHdf5File "lm::io::hdf5::Hdf5File":
        ...

这在我的 .pyx 文件中:

cdef class Hdf5File:
    cdef CppHdf5File* thisptr 
    ...

则 Cython 编译的 Python 库包含一个名为 Hdf5File 的类。理想情况下,我希望 Python 包含一个 lm.io.hdf5.Hdf5File 类(即 lm.io.hdf5 模块中的 Hdf5File 类)。换句话说,如果有办法将 C++ :: 范围运算符转换为 Python ,我会喜欢它。点运算符。

有没有办法让 Cython 很好地使用我现有的 C++ 命名空间?

Python C++ 命名空间 包装器 Cython

评论

2赞 gg349 1/12/2015
你试过你的文件吗?例如,您应该能够在同一个文件中使用,但是我现在没有机器可以尝试。请参阅示例和有关嵌套命名空间的信息from mypxd cimport lm.pyxlm.io.hdf5.Hdf5File.pyx

答:

0赞 Kevin 8/13/2022 #1

假设您的文件名为 。我会写如下:.pyxsource.pyxsetup.py

from setuptools import Extension, setup
from Cython.Build import cythonize

extensions = [
    Extension(
        name='lm.io.hdf5',
#             ^^^^^^^^^^   -- note the name here
        sources=[
            'path/to/source.pyx',
            # other sources like c++ files ...
        ],
        # other options ...
    ),
]

# Call `setup` as you wish, e.g.:
#setup(
#    ext_modules=cythonize(extensions, language_level='3'),
#    zip_safe=False,
#)

如果编译成功,这将生成 or like。 然后在 Python 中,您可以像这样导入:lm/io/hdf5.so

from lm.io.hdf5 import Hdf5File

参考:setuptools doc(字段文档)name