版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/89927630
一、链接配置
如果缺少头文件需要安装python3-dev:
sudo apt-get install python3-dev
链接libpython3.4库,添加头文件路径,以Qt为例:
INCLUDEPATH += /usr/include/python3.4
LIBS += -L /usr/lib/python3.4/config-3.4m-x86_64-linux-gnu -lpython3.4
二、头文件
因为python3中的slots定义和Qt的slots冲突,加载头文件时,使用如下方法避免冲突
#undef slots
#include <python3.4/Python.h>
#define slots Q_SLOTS
三、初始化
1、将要调用的/home/workspace/python/hello.py源码如下
# -*- coding: utf-8 -*-
def hello():
print("hello world!",flush=True)
2、C++程序如下:
//【1】初始化
Py_Initialize();
if ( !Py_IsInitialized() )
{
return -1;
}
//【2】添加python模块路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('/home/workspace/python/')");
//【3】导入python模块
PyObject* pModule = PyImport_ImportModule("hello");
if (!pModule) {
return -1;
}
四、调用python类
五、调用python函数
PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");
if(!pFunhello){
return -1;
}
1、无参数调用
PyObject_CallObject(pFunhello,NULL);
2、单个参数调用
PyObject* args = PyTuple_New(1);
PyObject* arg = Py_BuildValue("i", 100);
PyTuple_SetItem(args, 0, arg);
PyEval_CallObject(pFun, pArgs);
3、多个参数调用
以三个参数为例
PyObject* args = PyTuple_New(3);
PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数
PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数
PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
PyTuple_SetItem(args, 2, arg3);
PyEval_CallObject(pFun, pArgs);
其中Py_BuildValue的格式化字符的说明参考官网:
https://docs.python.org/zh-cn/3/c-api/arg.html?highlight=py_buildvalue#c.Py_BuildValue
4、数组参数调用
PyObject* pLists = PyList_New(0);
PyObject* pArgs = PyTuple_New(1);
for (int i = 0; i < 10; i++)
{
PyList_Append(pLists, Py_BuildValue("[i,i]", i,i)); //10x2的二维数组
}
PyTuple_SetItem(pArgs, 0, pLists);
PyEval_CallObject(pFun, pArgs);
六、结束,释放python
Py_Finalize();