gpt4 book ai didi

python - 为 Python 导出 C++ 类

转载 作者:行者123 更新时间:2023-11-28 04:32:28 25 4
gpt4 key购买 nike

我有一个用 C++ 编写的程序(目前作为静态库),具有非常抽象的接口(interface),在我的类等上使用运算符重载。我想从中创建一个共享库(Windows 上的 DLL 将是第一步,在尝试其他平台之前)在其他更“用户友好”的语言中使用它。我读到 Python 的 ctypes 对此有一定程度的支持。

我只是想知道,在我投入时间尝试做某事之前,是否可以使用 Python 中 C++ DLL 的一些更高级别的抽象来选择正确的选项,这是不可能的。用户应该能够初始化我的程序提供的类,并将它们与他们所有的方法一起使用,包括重载运算符(当然只有 python 中可用的那些)。还是 Python 只是为了支持一些简单的函数调用等?

C++ 代码(即使只是用户可访问的类)非常庞大,我想避免创建单独的 Python 包装器,因为所有需要的功能都已在 C++ 中完成。

最佳答案

由于没有人回答,我将在此期间提供我自己收集的所有内容。希望对某些人有所帮助。

Python 的 ctypes 旨在仅支持 C 语言特性。因此无法使用 ctypes 从 Python 直接访问类和其他 C++ 对象。但是,有一些方法可以访问它们。

繁琐的方法

为 C++ 类创建 C 风格对象,然后为它们创建 Python 包装器。

C 风格对象基本上是指向动态分配的 C++ 对象的指针。它应该有额外的方法,例如通常命名的 ->Release() 来销毁对象并释放分配的内存。然后你需要手动创建类似于原始 C++ 对象的 python 包装器,包括重载运算符等。 )

当您想完全控制正在发生的事情并且不介意在 Python 中复制界面时,这可能是最好的解决方案。

快速方法

Boost 提供了一个 Boost::Python 库来处理这个问题。它几乎可以让您导出任何您需要的东西 - 类、运算符,甚至多个重载方法。

唯一的问题是,这个库非常大,而且它是非头文件的 Boost 库之一,所以你需要弄清楚如何用你的项目构建它,这对人们来说可能并不容易,谁从未使用过 Boost(比如我自己)。

我不知道这个库到底做了什么,也许它只是自动化了前面方法中描述的相同的事情。因此,我不确定它是减少了额外包装器的级别,还是只是为您完成了所有硬包装工作,但它完成了我需要完成的工作。

更快的方法

幸运的是,我遇到了一个替代方案——pybind11。它是一个相对较小的库,与 Boost::Python 做同样的事情,而且它只是头文件。它有很好的文档并且易于使用。它被称为 pybind11 因为它最初是为了支持 C++11,但它目前支持 C++14 和实验性的 C++17,但我将它用于 C++17 项目并且目前没有发现问题。

我还不确定哪种方法最适合我的项目,但现在,我使用 pybind11,只是为了在项目开发过程中更轻松。

关于python - 为 Python 导出 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52495024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com