#include <iostream>
#ifdef WIN32
#include "Python.h"
#else
#include "/usr/local/include/python2.7/Python.h"
#endif
//如果是在windows-mingw-python2.7环境下,需要在工程->设置->Include和lib设置python2.7的路径,
//并在“链接 ”的参数中添加-Lc:\Python27\libs -lpython27
//如果是在linux环境下,则用下面命令进行编译链接
//g++ PythonTest.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7 -lpthread -ldl -lm -lutil -o test
using namespace std;
int main(int argc, char** argv)
{
//python初始化
Py_Initialize();
if(!Py_IsInitialized())
{
printf("Py_Initialize() Error!\n");
return -1;
}
//只有在linux下才需要指定路径
#ifndef WIN32
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
#endif
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs;
//载入module
pName = PyString_FromString("pytest");
pModule = PyImport_Import(pName);
if(!pModule)
{
printf("Can't find pytest.py");
getchar();
return -1;
}
//将module中的方法以字典形式读入
pDict = PyModule_GetDict(pModule);
if(!pDict)
{
printf("PyModule_GetDict Error!\n");
return -1;
}
//在方法字典中通过名字获取对应的方法
pFunc = PyDict_GetItemString(pDict, "add");
if(!pFunc || !PyCallable_Check(pFunc))
{
printf("Can't find function[add]\n");
getchar();
return -1;
}
//设置方法的参数
*pArgs;
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("f", 3.1));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("f", 4.3));
//调用方法add,传入参数 float
PyObject_CallObject(pFunc, pArgs);
//调用方法foo,传入参数int
pFunc = PyDict_GetItemString(pDict, "foo");
if(!pFunc || !PyCallable_Check(pFunc))
{
printf("Can't find function [foo]\n");
getchar();
return -1;
}
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 3));
PyObject_CallObject(pFunc, pArgs);
//调用方法hello,传入参数string
pFunc = PyDict_GetItemString(pDict, "hello");
if(!pFunc || !PyCallable_Check(pFunc))
{
printf("Can't find function [hello]\n");
getchar();
return -1;
}
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "World"));
PyObject_CallObject(pFunc, pArgs);
//释放之前的变量
Py_DECREF(pName);
Py_DECREF(pArgs);
Py_DECREF(pModule);
//python调用结束
Py_Finalize();
return 0;
}
Makefile文件
PYTHON_INCLUDE_FLAGS = \
-I/usr/local/include/python2.7
LIB_FLAGS = \
-L/usr/local/lib/python2.7 -lpython2.7 -lpthread -ldl -lm -lutil
SOURCE = \
PythonTest.cpp
all:${SOURCE}
g++ $(PYTHON_INCLUDE_FLAGS) $(SOURCE) ${LIB_FLAGS} -o test
clean:
rm -f test *.o *.out