首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Cython包装器中保存复杂的C++命名空间?

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

Stack Overflow用户
提问于 2015-01-12 03:09:32
回答 1查看 986关注 0票数 8

我正在为一个复杂的C++库编写一个Cython包装器。我想我已经知道了如何编写必要的.pxd和.pyx文件。我现在的问题是,尽管我的C++程序有大约100个不同的名称空间,但Cython编译的python库的名称空间完全是平坦的。

例如,如果我的.pxd文件中有这样的内容:

代码语言:javascript
复制
cdef extern from "lm/io/hdf5/SimulationFile.h" namespace "lm::io::hdf5":
    cdef cppclass CppHdf5File "lm::io::hdf5::Hdf5File":
        ...

在我的.pyx文件中:

代码语言:javascript
复制
cdef class Hdf5File:
    cdef CppHdf5File* thisptr 
    ...

然后,Cython编译的Python库包含一个名为Hdf5File的类。理想情况下,我希望Python包含一个lm.io.hdf5.Hdf5File类(即lm.io.hdf5模块中的一个lm.io.hdf5类)。换句话说,如果有一种方法将C++ ::作用域操作符转换为Python,我希望这样做。点操作符

有办法让Cython很好地处理我现有的C++名称空间吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-13 11:13:22

假设您的.pyx文件名为source.pyx。我将编写一个setup.py,如下所示:

代码语言:javascript
复制
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,
#)

如果编译成功,这将生成lm/io/hdf5.so或类似的内容。然后,在Python中,您可以这样导入:

代码语言:javascript
复制
from lm.io.hdf5 import Hdf5File

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27894759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档