我是靠谱客的博主 老实口红,最近开发中收集的这篇文章主要介绍python调用所嵌入C++程序提供的函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我在做一个c++程序,这个程序嵌入了python,而python脚本有些功能的数据又需要调宿主程序提供的函数来获取,网上搜的大部分都是python调c动态库,调宿主程序提供的函数基本没有说明,捣腾了半天终于搞好。

python嵌入C++就不说了,百度一大堆。

首先先说下C++程序给python提供函数,方法和以dll形式给python提供接口基本类似,主要是最后模块初始化函数稍微不一样。
概括下就是:
1.原先动态库导出的模块初始化函数有个PyMODINIT_FUNC宏声明换成PyObject*,
2.然后在python初始化之前(即Py_Initialize()调用之前)先添加下本次需新增的模块(PyImport_AppendInittab(“PyExt”, &PyInit_PyExt))
3.在py脚本里import PyExt
4.然后脚本里就可以调用PyExt提供的函数了

下面是代码:
PyExt.h


#include "python.h"
static PyObject* PyExt_test(PyObject *self, PyObject *args)
{
	return PyLong_FromLong(190508);
}

static PyMethodDef PyExtMethods[] =
{
	//{'导入进python调用的名字','对应调用的c函数名','函数调用方式','python调用help显示的帮助说明'}
	/*第3个字段用以决定函数的调用方式
	METH_VARARGS:多个形式参数,最常用的玩法
	METH_NOARGS:无参数,常用于输出类函数
	METH_VARARGS|METH_KEYWORDS :同时拥有匿名参数和关键字参数
	*/
	{ "rtn", PyExt_test, METH_NOARGS, NULL },
	{ NULL, NULL, 0, NULL },
};


static PyModuleDef PyExtModule =
{
	PyModuleDef_HEAD_INIT, "PyExt", NULL, -1, PyExtMethods,
	NULL, NULL, NULL, NULL
};

//下面初始化函数是导出c++动态库用的:以便python解释器能够对模块进行正确的初始化,初始化要以init开头,如initp
/*PyMODINIT_FUNC PyInit_PyExt(void)
{
	return PyModule_Create(&Module);
}*/

//这个初始化是python调用宿主程序的导出函数时需要用
static PyObject* PyInit_PyExt(void)
{
	return PyModule_Create(&PyExtModule);
};

main.cpp


#include "PyExt.h"
//python环境初始化
void Init()
{
	PyImport_AppendInittab("PyExt", &PyInit_PyExt);//加载本应用程序给python提供的额外函数 需要在文件里再improt下
	
	Py_Initialize();    // 初始化

	// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./python')");

	// 向python中添加参数名的模块
	// 初始化添加的模块

	// 加载模块
	PyObject* pModule = PyImport_ImportModule("main");//此处是python文件名
	if (!pModule) // 加载模块失败
	{
		return;
	}

	// 加载函数
	PyObject* pv = PyObject_GetAttrString(pModule, "testinit");//此处是python文件中的函数名称
	if (!pv || !PyCallable_Check(pv))  // 验证是否加载成功
	{
		return;
	}
	// 设置参数
	PyObject* args = PyTuple_New(2);   // 2个参数
	PyTuple_SetItem(args, 0, Py_BuildValue("i", 8));//0--序号,i表示创建int型变量
	PyTuple_SetItem(args, 1, Py_BuildValue("i", 6));//1--序号,i表示创建int型变量

	PyObject* pRet = PyObject_CallObject(pv, args);

	//将返回值转换为int类型
	int result = 0;
	PyArg_Parse(pRet, "i", &result);//i表示转换成int型变量
	Py_Finalize();
}

main.py

# -*- coding: GB2312 -*-
import string
import os
import PyExt

def testinit(a, b):
    return PyExt.rtn()

最后

以上就是老实口红为你收集整理的python调用所嵌入C++程序提供的函数的全部内容,希望文章能够帮你解决python调用所嵌入C++程序提供的函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(28)

评论列表共有 0 条评论

立即
投稿
返回
顶部