C++调用Python方法基本有以下几个步骤:
1、下载Python;
2、配置信息(本次我用的配置是VS2013+Python36),注意Python请下载32位的版本(即使你的操作系统是64位的),否则会函数未定义的错误
3、把Python加到VS2013的方法;先建立一个空的Win32控制台项目,创建main.cpp(具体代码下面由贴出),把python3.6的减压后,将里面的inlcude和libs两个文件夹拷贝到。sln的同一级目录下,然后打开libs,复制一份python36.lib,并命名为python36_d.lib(这个的原因是inlcude目录下的pyconfig.h里面的代码在debug下调用的是python36_d.lib), 然后右击进入属性设置页 C++->常规->附加包含目录,输入 ..\include; 再找到链接器->常规->附加目录项,输入 ..\libs; 接着找到链接器->输入->附加依赖项,添加python36_d.lib;到这里,配置信息就OK了;
4、接下来把python3.6的减压文件下的python36.dll拷贝到Debug目录下(与Test.exe同目录),并在该Debug目录下新建一个txt文件,改名为Test001.py(里面的内容下面将会贴出)
5、接下来就是代码部分:
main.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "Python.h"
}
//调用输出"Hello Python"函数
void Hello()
{
Py_Initialize();//调用Py_Initialize()进行初始化
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//调用的Python文件名
pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名
PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空
Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
}
//调用Add函数,传两个int型参数
void Add()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//Test001:Python文件名
pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python文件中的函数名
//创建参数:
PyObject *pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表示创建int型变量
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号
//返回值
PyObject *pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
//将返回值转换为int类型
int result;
PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量
cout << "6 + 8 = " << result << endl;
Py_Finalize();
}
int main(int argc, char** argv)
{
cout << "调用Test001.py中的Hello函数..." << endl;
Hello();
cout << "\n调用Test001.py中的Add函数..." << endl;
Add();
getchar();
return 0;
}
using namespace std;
extern "C"
{
#include "Python.h"
}
//调用输出"Hello Python"函数
void Hello()
{
Py_Initialize();//调用Py_Initialize()进行初始化
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//调用的Python文件名
pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名
PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空
Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
}
//调用Add函数,传两个int型参数
void Add()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//Test001:Python文件名
pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python文件中的函数名
//创建参数:
PyObject *pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表示创建int型变量
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号
//返回值
PyObject *pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
//将返回值转换为int类型
int result;
PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量
cout << "6 + 8 = " << result << endl;
Py_Finalize();
}
int main(int argc, char** argv)
{
cout << "调用Test001.py中的Hello函数..." << endl;
Hello();
cout << "\n调用Test001.py中的Add函数..." << endl;
Add();
getchar();
return 0;
}
6、Test001.py文件中内容
def Hello():
print("Hello Python")
print("Hello Python")
def Add(a, b):
return a+b
7、这样简单的C++调用Python的实现就完成了。