提问人:tel 提问时间:1/12/2015 最后编辑:tel 更新时间:8/14/2022 访问量:1129
如何在 Cython 包装器中保留复杂的 C++ 命名空间?
How do you preserve a complex C++ namespace in a Cython wrapper?
问:
我正在为一个复杂的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++ 命名空间?
答:
0赞
Kevin
8/13/2022
#1
假设您的文件名为 。我会写如下:.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,
#)
如果编译成功,这将生成 or like。
然后在 Python 中,您可以像这样导入:lm/io/hdf5.so
from lm.io.hdf5 import Hdf5File
参考:setuptools doc(字段文档)name
评论
from mypxd cimport lm
.pyx
lm.io.hdf5.Hdf5File
.pyx