为啥 2019 年我们仍然不能使用 ctypes 从 Python 调用 C++?

Posted

技术标签:

【中文标题】为啥 2019 年我们仍然不能使用 ctypes 从 Python 调用 C++?【英文标题】:Why can't we still use ctypes to call C++ from Python in 2019?为什么 2019 年我们仍然不能使用 ctypes 从 Python 调用 C++? 【发布时间】:2019-10-29 21:31:49 【问题描述】:

它仍然困扰着我。毕竟,C 也没有完全标准化的 ABI,但它适用于 ctypes。为什么 C++ 不能达到同样的效果?

我发现这个blog post 声称这个问题更多的是政治而不是技术,但它是 12 年前写的。这种说法今天仍然准确吗?

【问题讨论】:

这种说法今天仍然准确吗? 差不多。它需要 C++ 标准委员会来标准化 C++ ABI。要做到这一点需要政治,而不是技术诀窍。虽然这实际上可能会实现,但我不建议你屏住呼吸。 pypi.org/project/pybind11 【参考方案1】:

其实可以! (只是不使用 ctypes) https://cppyy.readthedocs.io/en/latest/

但是,为了实现这一点,它实际上嵌入了一个 C++ 解释器,并没有太多的性能优势。

C++ 没有官方 ABI 的一个原因是编译器非常注重性能,因此需要跨越函数和类边界进行优化。使用不同的设置,您可能会获得不同的界面,即使它具有相同的 ABI。一个很好的例子是返回值优化 (RVO),它改变函数签名以避免复制大型结构。

另一个原因是 C++ 是超元,大多数现代功能都依赖于生成代码并重新编译它的模板。因此,您只需要使用 C++ 编写代码的一部分。

【讨论】:

以上是关于为啥 2019 年我们仍然不能使用 ctypes 从 Python 调用 C++?的主要内容,如果未能解决你的问题,请参考以下文章

vs2019的jq为啥不能智能提示?

如何使用 ctypes 将 numpy ndarrays 传递给 c++ 函数?

尝试在 libc 上使用 ctypes 调用 environ 时,为啥 Python 会出现段错误?

为啥我们不能使用减号关键字而不是减号

vs2017为啥不能输出我要的结果,而是输出的下面的东西

为啥我不能在数据框中查看更多行? [复制]