Python调用C++接口
最近有这么一个需求,需要用Python对开发的应用做二次开发。这可难坏我了,之前也没有相关的经验,网上的资料也比较少。后来深度思考了下,这个问题本质上就是用python调用C++的接口。只要把C++的管理接口封装好,暴露给python,就可以达到我的需求了。
所以,问题就聚焦到了如何用C++调用python 即是我们今天的主题。
C++调用python的思路
现在Python也有很多版本,底层语言也有jave实现的,也有C实现的,但是为我们大众用得比较多的还是 CPython,就是底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,CPython优点是运行速度非常快。
嗯?底层是C语言实现的,那不是可以直接调用C的接口。那直接把C++的接口暴露为C接口是不是直接可以给Python调用呢?于是顺着这个思路往下延伸,得到了答案。
第一步:
把C++的接口声明为C接口。
第二步:
python加载C++的动态库。
对的就俩步。
代码如下:
C++:
extern "C" __declspec(dllexport)
class GuiLib
{
public:
explicit GuiLib();
void debug()
{
std::cout << "debug" << std::endl;
}
};
extern "C" __declspec(dllexport)
void callCpp()
{
GuiLib lib;
lib.debug();
}
python:
from ctypes import *
application = CDLL("./GuiLib.dll")
application.callCpp()
图片如下:
Python调用Qt/C++库
其实也差不多,只不过QWidget show的时候,界面需要持续显示就需要有事件循环,即是QApplication;
C++代码如下:
class Widget : public QWidget
{
public:
Widget(){}
~Widget(){}
};
extern "C" __declspec(dllexport)
int widgetShow()
{
int argc = 1;
const char *arg = "11";
char **argv = const_cast<char **> (&arg);
QApplication app(argc, argv);
Widget widget;
widget.show();
return app.exec();
}
Python代码如下:
# This Python file uses the following encoding: utf-8
from ctypes import *
application = CDLL("./GuiLib.dll")
application.widgetShow()
实际的调用效果如下:
结尾总结
如果C++软件用Python的二次开发上面不妨是个好思路,把软件的必要接口暴露为C接口,然后Python直接load相关动态库就是可直接调用了。是不是很简单。
这个只是我的一个简单思路,如果有大佬有更好的思路欢迎留言。
Demo 地址: https://download.csdn.net/download/Mario_z/16110678