c++ 调用 python函数,不能直接传入string类型,要变成char *类型的参数

本文详细介绍了如何使用C++调用Python代码的过程,包括初始化Python解释器、设置Python路径、导入模块、调用函数及传递参数等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Py_Initialize(); //初始化

//必须写
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径

//加载函数所i在文件名
PyObject * pModule = PyImport_ImportModule("pythonmain"); //test:Python文件名,若脚本有错则返回空

//加载 名为m的函数
PyObject *pfun = PyObject_GetAttrString(pModule, "m");

//传入string类型参数,这里注意一定要声明称 char *类型,不能直接传入string类型的参数
const char *r = "data/weight/";
const char *n = "football";


//建立形参 带有两个string类型的参数,放在一个元组里
	PyObject *args = PyTuple_New(2);
	PyTuple_SetItem(args, 0, Py_BuildValue("s", r));
	PyTuple_SetItem(args, 1, Py_BuildValue("s", n));
	PyObject *pReturn = PyEval_CallObject(pfun, args);

 

Python通过C语言扩展(ctypes模块)可以与C++动态链接库(DLL)交互。虽然Python本身不是直接支持不同函数参数类型和数量,但你可以创建ctypes结构体(structs)或者元组来模拟这些差异。以下是一个基本步骤: 1. **导入必要的库**: 首先,你需要导入`ctypes`库来处理C接口。 2. **定义C函数**: 在C++头文件中声明你要调用的不同函数,指定它们的返回类型参数列表。例如: ```cpp extern "C" int func1(int arg1); extern "C" double func2(char* str, int arg2); ``` 3. **加载DLL**: 使用`ctypes.cdll.LoadLibrary`加载C++ DLL: ```python dll = ctypes.cdll.LoadLibrary('your_library.dll') ``` 4. **创建函数指针**: 对于每个不同的函数,创建对应的函数指针,并指定参数类型: ```python func1_ptr = dll.func1 func1_ptr.argtypes = [ctypes.c_int] # 指定func1的第一个参数为int类型 func2_ptr = dll.func2 func2_ptr.argtypes = [ctypes.c_char_p, ctypes.c_int] # 指定func2的两个参数类型 func2_ptr.restype = ctypes.c_double # 指定func2的返回值类型为double ``` 5. **调用函数**: 现在你可以像调用Python内置函数一样调用这些C++函数,尽管参数类型可能会有所不同: ```python result1 = func1_ptr(10) # 虽然参数不同,但这里是硬编码了参数 result2 = func2_ptr(b'some string', 20) # 字符串需要换成char* ``` 请注意,对于不同参数类型函数,实际调用时需要保证传入正确的数据类型。另外,在Python中处理参数数量不同的情况通常需要在调用时手动检查,或者为每种情况编写特定的处理代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值