【Qt】调用Python函数:无参数、单个参数、多个参数、数组参数

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/89927630
今日推荐