C++调用Python
作者:互联网
一 开发环境配置
先安装python, 自行百度。安装ok后,在安装目录会有python的C头文件,lib,dll, 这些在写C++程序时都会用到。
我用的是Python3.7,在VS2015中项目属性配置Python的头文件,库文件
(1)包含python的头文件:右键项目属性---C/C++ --- 常规 ---- 附加包含目录
(2)包含lib
二 编写代码
添加头文件 #include "Python.h“
加载静态库 #pragma comment(lib, "python37.lib")
把Hello.py放到程序当前路径, 两个函数,用Pythton写的加法和减法函数。
'''' 简单的Python程序 ''' def Add(a, b): c = a + b return c def Sub(a, b): c = a - b return c
C++ 代码如下:
/* C++ 程序如何调用Pyhton程序 */ #include "stdafx.h" #include#include "Python.h" using namespace std; //导入python静态库 #pragma comment(lib, "python37.lib") int main() { PyObject* pName = NULL; PyObject* pModule = NULL; PyObject* pDict = NULL; PyObject* pFunc = NULL; PyObject* pArgs = NULL; PyObject* pRet = NULL; // 1 初始化Python, 在使用Python系统前,必须使用Py_Initialize对其进行初始化; Py_Initialize(); // 2 检查初始化是否成功, 返回0初始化失败 int nRet = Py_IsInitialized(); if (nRet == 0) { cout << "Python环境配置错误,初始化失败" << endl; return -1; } // 添加当前路径 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); //3 加载python文件 pModule = PyImport_ImportModule("Hello"); //在使用这个函数的时候,只需要写Hello.py文件的名称就可以了, 不用写后缀 if (!pModule) { cout << "can't find Hello.py" << endl; return -1; } //4 导出Hello.py中的 Add方法 pFunc = PyObject_GetAttrString(pModule, "Add"); //5 传参,Add函数有两个参数,传入数量2 pArgs = PyTuple_New(2); //0:表示序号,第一个参数; 1:表示第二个参数 //i:表示传入的参数类型时int类型 PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2)); // 2 表示参数2 PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4)); // 4 表示参数4 //6 正式执行Add函数 PyObject *pReturn = PyEval_CallObject(pFunc, pArgs); int nResult; PyArg_Parse(pReturn, "i", &nResult); //i表示转换成int型变量 cout << "2 + 4 = " << nResult << endl; //7 释放Python Py_Finalize(); system("pause"); return 0; }
编译时可能会遇到以下的错误
出现这个错误的原因是:python_d.lib是 库的调试后形式,当我们以debug模式编译工程时,python就用这个lib文件,但是这个文件是不可用 的。对于这点,最快的办法就是强制要求python在任何情况下都是用非调试版本,就可以了。修改python头文件pyconfig.h的配置,修改指向调试库文件的参数,287行的python37_d.lib改为python37.lib,如下图:
F5运行,程序无法运行,缺少python37.dll, 在电脑上找到python37.dll放到Debug目录即可。
标签:调用,lib,Python,C++,PyObject,python,python37,NULL 来源: https://blog.51cto.com/u_12570763/2845441