【问题标题】:Are C++11 containers supported by Cython?Cython 是否支持 C++11 容器?
【发布时间】:2013-10-15 07:43:21
【问题描述】:

Cython 为我们提供了一种导入 C++ 标准库数据结构的简单方法,例如:

  from libcpp.vector cimport vector
    from libcpp.utility cimport pair

但是 C++11 引入的新容器呢:std::unordered_mapstd::unordered_set 等。它们是否以相同的方式支持?我找不到合适的导入语句。

【问题讨论】:

    标签: python c++ c++11 cython c++-standard-library


    【解决方案1】:

    Cython 默认不支持它们,但您可以按照https://github.com/cython/cython/blob/master/Cython/Includes/libcpp/map.pxd 的结构创建自己的接口。

    Cython 现在支持 unordered_map 和 unordered_set,因为 0.20.2

    from libcpp.unordered_map cimport unordered_map
    from libcpp.unordered_set cimport unordered_set
    

    【讨论】:

    • 这个答案当时可能是正确的,但现在已经过时了。
    【解决方案2】:

    当前的 cython 版本允许它们。

    确保您的 setup.py 包含以下内容:

    ext_module = Extension(
        "foo",
        ["foo.pyx"],
        language="c++",
        extra_compile_args=["-std=c++11"],
        extra_link_args=["-std=c++11"]
    )
    

    然后你可以使用

    from libcpp.unordered_map cimport unordered_map
    

    与任何其他 STL 类一样。

    【讨论】:

    • 这似乎不适用于(现在的)Cython:/usr/local/lib/python2.7/dist-packages/Cython/Compiler/Main.py:554: UserWarning: got unknown compilation options, please remove: extra_link_args, extra_compile_args(然后它失败并出现与 C++11 相关的错误)。我的 setup.py 看起来像:ext_modules = cythonize('x.pyx', language='c++', <options>).
    • @David 你必须使用 Extension() 语法,而不是直接在 cythonize() 中指定参数。
    • 我必须在 extra_compile_args 中添加“-stdlib=libc++”才能让它在 Mac OSX 10.11.6 上工作
    • 在 ubuntu 20.04,Cython 版本 0.29.23 上它可以运行 OOTB,无需额外设置。
    猜你喜欢
    • 2018-10-17
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2012-01-08
    相关资源
    最近更新 更多