1. 环境配置及参考文档
c++调python环境配置
Python/C API参考文档
2. 代码
2.1 目录结构
2.2 cp1.cpp
#include <Python.h>
int main(int argc, char* argv[])
{
// 初始化Python
Py_Initialize();
// 检查初始化是否成功
if (!Py_IsInitialized()) {
return -1;
}
// 添加当前路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("print ('---import sys---')");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pName, *pModule, *pFunc, *pArgs;
// 载入名为pytest的脚本
pName = PyUnicode_FromString("cp1");
pModule = PyImport_Import(pName);
if (!pModule) {
printf("can't find cp1.py");
getchar();
return -1;
}
// 找出函数名为add的函数
printf("----------------------\n");
pFunc = PyObject_GetAttrString(pModule, "sum");
//找不到add函数的原因:py文件和cpp文件不能以test为名
if (!pFunc || !PyCallable_Check(pFunc))
{
printf("can't find function [sum]");
getchar();
return -1;
}
// 参数进栈
*pArgs;
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", 3));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("l", 4));
// 调用Python函数
PyObject_CallObject(pFunc, pArgs);
//下面这段是查找函数foo 并执行foo
printf("----------------------\n");
pFunc = PyObject_GetAttrString(pModule, "foo");
if (!pFunc || !PyCallable_Check(pFunc))
{
printf("can't find function [foo]");
getchar();
return -1;
}
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", 2));
PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pName);
Py_DECREF(pArgs);
Py_DECREF(pModule);
// 关闭Python
Py_Finalize();
return 0;
}
2.3 cp1.py
import cp2
def sum(a,b):
cp2.add1(a,b);
return
def foo(a):
print ("in python function foo" )
print ("a = " + str(a) )
print ("ret = " + str(a * a) )
return
2.4 cp2.py
def add1(a,b):
print ("in python function add")
print ("a = " + str(a) )
print ("b = " + str(b))
print ("ret = " + str(a+b))
return
3. 报错
3.1 编码报错
问题:使用简体中文编码与UTF-8不匹配
解决:使用notepad++打开cpp和py文件,选择utf-8编码,保存。
3.2 找不到py文件中的函数
问题:can’t find function sum
解决:py文件和cpp文件不能以test为名
总结
有点意思!