C++调用python代码(有参)
文件夹结构
|--c_python
|--add.py
|--main.cpp
建立python代码
在c_python文件夹内新建python代码add.py,代码内容:
def num_add(a, b):
c = a + b
return c
def main():
print(num_add(2, 3))
if __name__ == "__main__":
main()
运行python代码,结果输出 5
建立C++代码
在c_python文件夹内新建c++代码main.cpp,代码内容:
#include <Python.h>
#include <iostream>
int main()
{
// 1. 初始化python接口
Py_Initialize();
if (!Py_IsInitialized())
{
std::cout << "python init failed" << std::endl;
return 1;
}
// 2. 初始化python系统文件路径,保证可以访问到.py文件
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')"); //要将python代码根目录添加到路径中
// 3. 调用python文件名,不用写后缀
PyObject* module = PyImport_ImportModule("add");
if (module == nullptr)
{
std::cout << "module not found: add.py" << std::endl;
return 1;
}
// 4. 获取函数对象
PyObject* func = PyObject_GetAttrString(module, "num_add");
if (!func || !PyCallable_Check(func))
{
std::cout << "function not found: num_add" << std::endl;
return 1;
}
// 5. 给python传递参数
PyObject* args = PyTuple_New(2);
// 0: 第一个参数, 传入int类型值1
PyTuple_SetItem(args, 0, Py_BuildValue("i", 1));
//1: 第二个参数, 传入int类型值2
PyTuple_SetItem(args, 1, Py_BuildValue("i", 2));
// 使用C++的Python接口调用该函数
PyObject* ret = PyObject_CallObject(func, args);
// 接收Python计算好的返回值
int result;
// i 表示转换成int型变量
// 在这里,最需要注意的是:PyArg_Parse的最后一个参数,必须加上“&”符号
PyArg_Parse(ret, "i", &result);
std::cout << "return is " << result << std::endl;
//6. 结束python接口初始化
Py_Finalize();
return 0;
}
运行C++代码
这里在ubuntu环境下,使用g++方式运行(python改成自己电脑安装对应的版本)
g++ main.cpp -o add -I/usr/include/python3.10 -lpython3.10
./add
结果输出:return is 3