简介
python 丰富的模块文件使得python在完成一些功能时非常的方便,在工程中调用python脚本使得效率大大提升。
一、环境配置
python环境配置
要想在vs中调用python脚本,先要将python的解释环境配置到vs工程中。在vs中新建qt工程。然后将python解释器环境拷贝到工程目录下。

得到python解释器环境的方式有很多:
- 复制安装好的整个python环境
- 使用pycharm等三方工具创建虚拟环境
-
从安装好的python环境中提取所需要的环境
本文采用第三中方式
VS+QT调用python脚本 复制图中三个文件夹到一个新的文件夹中,在拷贝到工程目录下。
工程环境配置
属性 -> c/c++ ->常规 -> 附加包含目录 添加python环境的include文件夹
属性 ->链接器 ->常规 -> 附加库目录 添加python环境的libs文件夹VS+QT调用python脚本 属性 ->链接器 ->输入-> 附加依赖项 添加python36.libVS+QT调用python脚本 然后再工程中包含python.h文头件,编译VS+QT调用python脚本
避坑
1.编译时报错“错误 LNK1104 无法打开文件“python36_d.lib”,将libs中的python36.lib复制一份,重命名为python36_d.lib
2.编译报错error: expected unqualified-id before ‘;’ token,这是与qt的slots关键字冲突,解决办法是将python中的slot取消宏定义,然后再恢复,如下图
二、调用python脚本
python脚本
def add(a, b):
c=a+b
return c
c++代码
Py_Initialize();
if (!Py_IsInitialized())
{
printf("error!");
PyErr_Print(); //打印错误
return ;
}
//先获得py文件所在的路径,必须要绝对路径
QString path = QDir::currentPath();
path = path.replace("\\", "/");
qDebug() << path << endl;
path ="sys.path.append('"+ path+"/pycode"+"')";
QByteArray temp = path.toLocal8Bit();
//再设置python运行路径
PyRun_SimpleString("import sys");
PyRun_SimpleString(temp.data());
/**************************/
//如果在py中import了其他模块,应该其他模块也设置到运行路径中
//PyRun_SimpleString("sys.path.append('C:/Users/Administration/Desktop/123/python/Lib/site-packages')");
/**************************/
//导入hello.py模块
PyObject* pModule = PyImport_ImportModule("hello");
if (!pModule) {
printf("Cant open python file!\n");
return;
}
//调用hello脚本
//PyObject_CallFunction(pModule, NULL);
//通过模块获得add函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
if (pFunc)
{
//创建参数列表
PyObject* args = PyTuple_New(2);
PyObject* arg1 = PyLong_FromLong(11111);
PyObject* arg2 = PyLong_FromLong(22222);
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
PyObject *result = PyObject_CallObject(pFunc,args);
if (result)
{
long a = PyLong_AsLong(result);
qDebug() << "a:" << a << endl;
}
}
//结束,释放python
Py_Finalize();
运行结果
完整代码下载