我正在考虑在我的程序中使用python(CPython),既允许在我的环境中使用用户脚本,又允许我使用pyside,即qt绑定来为我的应用程序创建GUI。这些代码可以有效地分离出来,其思想是GUI python代码可以在以后快速编译(如果可能的话)。
我对python很陌生,我真的在寻找一种最有效的方法来生成可靠的绑定,并且随着项目的发展,绑定很可能会经常更改,因此要维护的额外代码绝对是最少的。我需要它,以便python类扩展具有虚拟机的c++类。
我已经研究过PyBindGen,它经常被我的库中的东西噎住,以至于它实际上没有用处。
您在这方面推荐的任何帮助/建议/链接/工作流都将非常有用。
现代C++使用克里夫(https://github.com/google/clif)。 它没有发现您的API,您需要用Python术语描述它。
克里夫将用最新的LLVM/CLAN编译器重新编译您的头,并为Python扩展模块生成C++源代码。它可以理解复杂的数据结构:
def f() -> dict<str, set<int>>
。我说,我必须补充,通常,当你有约束力时,你不会盲目地把C++中的所有东西都绑定到Python中。如果你这样做,你不会从Python的侧面得到一个非常的python感。相反,您设计了希望库以Python最可能的方式使用的库,然后返回并查看如何使用可能的绑定库之一将其插入到C++代码中。例如,与其处理
std::vector
,不如让库调用处理Python列表或iterable。如果C++库接收到一个^ {CD2}},那么您希望用Python字典处理。如果是数组,那么numpy.ndarray
可能更方便。等等。。。也就是说,您仍然可以设计绑定,以便将维护最小化。
这是一个其他Python/C++包的列表,如果您决定进一步查看:
它们现在处于非活动状态:
为了完整起见,也可以将编译后的C代码直接加载到Python中,而不必创建正式的绑定。您可以使用FFI来完成此操作 对于这两个Python模块中的任何一个:
如果你在寻找速度,我肯定也会投给赛顿。据我所知,关于C++与Python接口的其他方法,与其他绑定工具相比,Cython的维护/更新并不那么重,而是关于工作流的“流动性”增益。(Cythonized代码认为其速度与纯C一样快,或者距离纯C不远,这也使得它非常有趣)。
无论如何,有几个好的API连接Python代码和C++(Boost.Python,…),但是我认为所有这些都会导致需要直接在C++源代码中公开方法(你们告诉我,如果我错了,或者不精确)。
另一方面,Cython将为您提供将C++ API(GUI,或任何…)严格地与曝光源(所谓的PYX扩展)隔离的可能性。最后的工作流程是:
< P> C++ +API=&编译;作为共享对象= & gt;Cython扩展(s)(导入和暴露C++特征)= &编译扩展(s)=& gt;使用扩展(扩展到Python路径)。好消息是,您必须只维护池中的Pyx文件的变化部分,这些文件与正在演化的C++特性(其中需要被曝光的那些)有关。一开始这是一种投资,但是,以我的经验,一旦这个工作流程建立起来,就可以很直接地使整个事情变得复杂起来。
现在考虑到您需要扩展具有virtual的类并从Python重写它们(如果我正确理解了您的意思)。这是可行的。再一次,不是那么直接,但是你应该看看这个thread。
坏消息:在那个特殊情况下,如果扩展Python没有重写给定的父方法,则必须创建一些额外的C++适配器/接口,以便启用父方法的调用。(注意,从Python重新定义C++暴露方法,无论是虚拟还是非,都是函数的替换,但绝对不等同于重写)。
哼,现在我又在读自己的文章了,看起来有点困惑。希望这还是有帮助的。
如果你选择Cython选项,如果你让我做的话,我可以更具体地说明你必须处理的工作流,但是我认为上面链接的线程是一个很好的起点。。。
相关问题 更多 >
编程相关推荐