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

tel*_*tel 6 c++ python namespaces wrapper cython

我正在为复杂的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":
        ...
Run Code Online (Sandbox Code Playgroud)

这在我的.pyx文件中:

cdef class Hdf5File:
    cdef CppHdf5File* thisptr 
    ...
Run Code Online (Sandbox Code Playgroud)

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

有没有办法让Cython与我现有的C++命名空间很好地配合?

Kev*_*vin 0

假设您的.pyx文件名为source.pyx. 我会写setup.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,
#)
Run Code Online (Sandbox Code Playgroud)

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

from lm.io.hdf5 import Hdf5File
Run Code Online (Sandbox Code Playgroud)

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