导出 Python 的C++类
Export of C++ classes for Python
我有一个用C++编写的程序(现在作为一个静态库(,具有非常抽象的接口,在我的类等上使用运算符重载。我想用它创建一个共享库(在尝试其他平台之前,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中不可重载的是赋值运算符。
当您想要完全控制正在发生的事情并且不介意在 Python 中复制接口时,这可能是最好的解决方案。
快速方法
Boost提供了一个 Boost::P ython 库来处理这个问题。它允许您导出几乎任何您需要的东西 - 类,运算符,甚至多个重载方法。
唯一的问题是,这个库非常大,它是非仅标题的 Boost 库之一,所以你需要弄清楚如何使用你的项目构建它,这对于从未使用 Boost 的人来说可能并不容易(比如我自己(。
我不知道这个库到底做了什么,也许它只是自动执行前面方法中描述的相同事情。所以我不确定它是否降低了额外包装器的级别,或者只是简单地为您完成所有艰苦的包装工作,但它完成了我需要做的事情。
更快的方法
幸运的是,我遇到了另一种选择 - pybind11。这是一个相对较小的库,与 Boost::P ython 做同样的事情,并且它只是标头。它有很好的文档并且易于使用。它被称为 pybind 11,因为它最初是为了支持 C++11,但它目前支持 C++14 和实验性 C++17,但我在 C++17 项目中使用它,到目前为止没有发现任何问题。
我还不确定哪种方法最适合我的项目,但现在,我使用 pybind11,只是为了让在项目开发过程中更容易。
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 使用Pybind11向Python公开Eigen::张量
- Python str to C++ to Python str
- 如何使用Python从C++中读取谷物序列化数据
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何在c++中使用system()来运行包含空格的python脚本
- python集合的C++等价物是什么.计数器
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 如何将真正的字符串从python c-api转换为python脚本
- Python ctype 'c_char_p' Memory Leak