C++调用Python的方法以及问题集

1. C++调用Python的方法

直接先上案例:

#include </home/will/anaconda3/envs/openface/include/python3.6m/Python.h>
using namespace std;

int main(int argc, char **argv)
{
	Py_Initialize(); //这个是初始化python调用程序,必须
	string path = "/media/will/Will/MyOpenFace-2019-1-30/exe/py_script";
	string chdir_cmd = string("sys.path.append(\"") + path + "\")";
	const char* cstr_cmd = chdir_cmd.c_str();
	PyRun_SimpleString("import sys");//使用python语句
	PyRun_SimpleString(cstr_cmd);
	PyObject* moduleName = PyUnicode_FromString("LeastSquare"); //将string类型转换成unicode类型
	PyObject* pModule = PyImport_Import(moduleName);// name of python file 导入名为‘LeastSquare’的python脚本
	// 判断pModule是否为0,是0就报错
	cout << pModule << endl; //20201127 0
	if (!pModule){
		cout << "[ERROR] Python get module failed." << endl;
		return 0;
	}
	cout << "[INFO] Python get module succeed." << endl;
	PyObject* pv = PyObject_GetAttrString(pModule, "predict");// get function from python file 使用python脚本中的函数
	if (!pv || !PyCallable_Check(pv)){
		cout << "[ERROR] Can't find funftion (test_add)" << endl;
		return 0;
	}
	cout << "[INFO] Get function (test_add) succeed." << endl;
	Py_Finalize();// 结束Python调用

2.调用过程中遇到的问题

1) 一开始调用python头文件就报错,提示说找不到
解决:用locate定位Python.h的位置,然后把绝对路径弄上去。
我之前试过调用没出现这个问题,迷惑,不知道怎么又出现这个问题,望有大佬路过,提点一下

#include <Python.h>

修改后解决:

#include </home/will/anaconda3/envs/openface/include/python3.6m/Python.h>

2)导入python脚本总是失败
pModele的返回值经常是0,这个问题是由于Python脚本中调用了很多包,而当前环境中没有安装成功,很多时候python都是在另一个环境中写好和测试的,anaconda这种,换了一个环境,忘了把原来的需要用的库和包装上。
解决:把python需要用到的库和包装上就解决了,用pipconda都是,如:
pip install sklearn pandas matplotlib joblib
安装完,最好先在当前环境中,测试一遍,看看是不是所有需要import的包都可以正常打开


Reference:

https://blog.csdn.net/lichkingyang/article/details/52061051
https://www.cnblogs.com/betterwgo/p/8176525.html
例程:
https://www.jianshu.com/p/c9f5f4ce3e7a?utm_campaign=maleskine
https://blog.csdn.net/qq_41433316/article/details/97141318

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Qt C++调用 Python方法,可以使用 Python 的 C/C++ API 或者使用第三方库,如 Boost.Python 或 pybind11。这里提供使用 Python C/C++ API 的方法。 首先需要在 Qt C++ 项目中添加 Python 的头文件和库文件路径。在 .pro 文件中添加以下代码: ```pro INCLUDEPATH += /usr/include/python3.6m/ LIBS += -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ -lpython3.6m ``` 其中 `/usr/include/python3.6m/` 和 `/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/` 是 Python 的头文件和库文件路径,需要根据实际情况进行修改。 然后在 Qt C++调用 Python方法,可以按照以下步骤进行: 1. 初始化 Python 解释器: ```c++ Py_Initialize(); ``` 2. 导入 Python 模块: ```c++ PyObject* pModule = PyImport_ImportModule("module_name"); ``` 其中 `"module_name"` 是 Python 模块的名称。 3. 获取 Python 方法: ```c++ PyObject* pFunc = PyObject_GetAttrString(pModule, "function_name"); ``` 其中 `"function_name"` 是 Python 方法的名称。 4. 调用 Python 方法: ```c++ PyObject* pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "argument")); PyObject* pResult = PyObject_CallObject(pFunc, pArgs); ``` 其中 `"argument"` 是传递给 Python 方法的参数。需要注意的是,在 Py_BuildValue 函数中需要指定参数类型,例如使用 `"s"` 表示字符串类型。 5. 处理 Python 方法的返回值: ```c++ char* result; PyArg_Parse(pResult, "s", &result); ``` 其中 `"s"` 表示返回值的类型为字符串类型。 6. 释放 Python 对象: ```c++ Py_DECREF(pArgs); Py_DECREF(pResult); Py_DECREF(pModule); ``` 最后,在程序结束时需要清理 Python 解释器: ```c++ Py_Finalize(); ``` 以上是基础的调用 Python 方法的步骤,具体实现还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值