代码之家  ›  专栏  ›  技术社区  ›  egst

Python C++类的导出

  •  0
  • egst  · 技术社区  · 6 年前

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

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   egst    6 年前

    既然没有人回答,我将提供我在此期间收集的一切。希望能对一些人有所帮助。

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

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

    C样式对象基本上是指向动态分配的C++对象的指针。它应该有额外的方法,比如传统命名的 ->Release() 销毁对象并释放分配的内存。然后,您需要手动创建Python包装,它将类似于原始C++对象,包括重载操作符等(StutoOut:我遇到的唯一操作符,在这种情况下可能需要,并且在Python中不可重载为赋值运算符)。

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

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

    更快的方法

    11 因为它原本是支持C++ 11的,但是它目前支持C++ 14和实验C++ 17,但是我用C++来处理它,到目前为止还没有发现任何问题。

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