一、环境前期准备
安装Qt5.x版本
安装Python
二、实现核心代码
C++调用Python代码
PythonOutputCapturer::PythonOutputCapturer(QObject *parent) : QObject(parent)
{
// 重定向Python的stdout到这个对象
Py_Initialize();
}
PythonOutputCapturer::~PythonOutputCapturer()
{
Py_Finalize();
}
void PythonOutputCapturer::excutePython(const QString &script)
{
// 导入io模块以捕获输出
PyObject* ioModuleString = PyUnicode_FromString("io");
PyObject* ioModule = PyImport_Import(ioModuleString);
Py_DECREF(ioModuleString);
// 使用io.StringIO作为stdout
PyObject* catcher = PyObject_CallMethod(ioModule, "StringIO", NULL);
PyObject* sysModule = PyImport_ImportModule("sys");
PyObject_SetAttrString(sysModule, "stdout", catcher);
PyRun_SimpleString(script.toUtf8());
// 从StringIO对象中获取输出并打印
PyObject* output = PyObject_CallMethod(catcher, "getvalue", NULL);
emit pythonOutput(QString::fromUtf8(PyUnicode_AsUTF8(output)));
// 清理
Py_DECREF(output);
Py_DECREF(catcher);
Py_DECREF(ioModule);
Py_DECREF(sysModule);
}
此处实现了重定向标准输出,关键代码
// 导入io模块以捕获输出
PyObject* ioModuleString = PyUnicode_FromString("io");
PyObject* ioModule = PyImport_Import(ioModuleString);
Py_DECREF(ioModuleString);
// 使用io.StringIO作为stdout
PyObject* catcher = PyObject_CallMethod(ioModule, "StringIO", NULL);
PyObject* sysModule = PyImport_ImportModule("sys");
PyObject_SetAttrString(sysModule, "stdout", catcher);
效果
三、Python中在调用C++代码
创建C接口,导出dll
#ifndef PYTHONCALLINTERFACE_H
#define PYTHONCALLINTERFACE_H
#ifdef __cplusplus
extern "C" {
#endif
int functionA(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // PYTHONCALLINTERFACE_H
#ifndef PYTHONCALLC_H
#define PYTHONCALLC_H
class PythonCallC
{
public:
PythonCallC();
public:
int functionA(int a, int b);
};
#endif // PYTHONCALLC_H
#include "PythonCallC.h"
PythonCallC::PythonCallC()
{
}
int PythonCallC::functionA(int a, int b)
{
return a + b;
}
根据上面实现功能,输入Python脚本
import ctypes
# 加载动态链接库
lib = ctypes.cdll.LoadLibrary("./PythonCallC.dll")
# 定义函数参数类型和返回值类型
lib.functionA.argtypes = [ctypes.c_int, ctypes.c_int]
lib.functionA.restype = ctypes.c_int
# 调用 C++ 函数
result = lib.functionA(4444, 33333)
print("调用C++库的结果:" + str(result))
还没有评论,来说两句吧...