Python掉用Qt/C++接口

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

猜你喜欢

转载自blog.csdn.net/Mario_z/article/details/115188670
今日推荐