我有自己的C++库项目(带有源代码),用Qt编写,它使用^ {CD1>},^ {< CD2>},^ {CD3>}信号和槽。在
我也希望用Python支持这个库。在
最好的方法是什么?在
因为这个库是SDK的一部分,所以事实上也同样适用于用.NET支持QT-dll,这是在支持Python之后的第二步。在
Qt的示例API。在
quint16 SendCommandAsync(CmdBaseSpv1* pcommand,
ConnectionArg connectionArg,
emitLogOptions::emitLogOption logOption,
LogInfo &txLogInfo,
LogInfo &rxLogInfo);
我想从Python调用这个函数。
函数参数CmdBaseSpv1
、ConnectionArg
、emitLogOption
、LogInfo
都是Qt类。
其中一些参数正在使用QOBJECT
基类。在
从函数名可以看出,这是一个异步函数调用。结果将发出一个信号,所以我也需要得到异步结果。在
您会询问如何用Python重写库。我想这要看情况而定。如果代码很琐碎,那么我不知道为什么不。如果它更大,并且必须与其他代码保持最新(正如你在.Net中所暗示的那样),我就不会这样做了。在
我的建议
从我看到的代码来看,我会尝试使用boost::python或SWIG来包装它。在
如何包装
主要的问题是在Python中创建
CmdBaseSpv1
、ConnectionArg
等。在如果不需要任何Qt类来实例化类,这应该很简单。但是,如果您需要Python内部的Qt类型(例如,因为
CmdBaseSpv1
的构造函数需要QString
),那么您的任务就复杂得多,因为您需要一种将Python字符串转换为QString
的方法。如果可以,您应该只使用stl
-类型。在Python中的所有内容
包装小型C库的最简单方法是使用cffi module(或ctypes)。您可以用Python编写完整的绑定。但是,如果API很大并且很难实现,则需要大量的手动操作。在
还有一个问题:cType是only compatible with C,不是C++。因此,你需要改变你的接口,以兼容C,在内部,你仍然可以使用C++和QT。在
用手包装
另一种方法是包装库调用您自己。您可以使用Python API来执行此操作。还有一些库可以帮助您创建绑定。{a7}似乎特别有前途,并且用C++来工作。在
捆绑发电机
如果你的API很大,你应该使用一个绑定生成器来解析C++代码并生成绑定本身。例如,sip就是其中之一。它用于为整个
Qt
库创建绑定。有一些绑定生成器,Python文档中提到的一个是SWIG。PySide使用了Shiboken,并且在他们的网站上有一个很好的描述。在SWIG还有一个额外的优势,您可以为多种语言创建绑定,包括C。在
PyQt公司
PyQt是使用sip从Qt生成的绑定。您可能不需要它,除非您需要从Python内部访问Qt的全部功能。如果是这样,考虑使用
sip
来生成绑定,这样像信号槽机制这样的东西在库和PyQt之间是兼容的。在绑定的挑战
绑定面临一些挑战,因为Python和C++在一些关键领域是不同的。在
内存管理
内存管理在Python中几乎是自动的,在C++中你需要手动完成。例如
在
^{pr2}$myfunc()
结尾,mywidget得到垃圾回收。在C++中,但是mywidget
还在。这意味着即使在Python内部,也需要注意C++内存管理。我看到的问题是内存泄漏和指针悬空。使用回调时要注意这一点,你不想让Python垃圾回收回调,而C++认为它仍然活着。在例外情况
并不是所有的编程语言都有异常或以相同的方式处理它们。例如,如果在Python中捕获到C++中的异常,那就太好了。在
相关问题链接
相关问题 更多 >
编程相关推荐