C++调用Python浅析

在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。灵活性大大的提高了。

通过C++调用Python脚本主要要用到如下的一些Python提供的API,因为实际上C++要调用的是Python的解释器,而Python解释器本质就是实现在动态链接库里面的,因此在调用前和调用后要进行一些初始化和资源释放的工作,另外,要调用Python脚本里面的函数等等东西,需要Python提供的一些特殊API来包装C++调用。(可以参考[2])。

void Py_Initialize(void)

初始化Python解释器,如果初始化失败,继续下面的调用会出现各种错误,可惜的是此函数没有返回值来判断是否初始化成功,如果失败会导致致命错误。 

int Py_IsInitialized(void)

检查是否已经进行了初始化,如果返回0,表示没有进行过初始化。 

void Py_Finalize()

反初始化Python解释器,包括子解释器,调用此函数同时会释放Python解释器所占用的资源。 

int PyRun_SimpleString(const char *command)

实际上是一个宏,执行一段Python代码。 

PyObject* PyImport_ImportModule(char *name)

导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。 

PyObject* PyModule_GetDict( PyObject *module)

相当于Python模块对象的__dict__属性,得到模块名称空间下的字典对象。 

PyObject* PyRun_String(const char* str, int start,PyObject* globals, PyObject* locals)

执行一段Python代码。 

int PyArg_Parse(PyObject* args, char* format, ...)

把Python数据类型解析为C的类型,这样C程序中才可以使用Python里面的数据。 

PyObject* PyObject_GetAttrString(PyObject *o, char*attr_name)

返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句,o.attr_name。 

PyObject* Py_BuildValue(char* format, ...)

和PyArg_Parse刚好相反,构建一个参数列表,把C类型转换为Python对象,使得Python里面可以使用C类型数据。 

PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)

此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。


PyTorch源码解读是一个系列文章,从底层的Tensor开始,逐步解析神经网络算符、自动微分引擎和Python扩展等核心源码。这个系列共有五篇文章,每篇都有大量的代码和解析。如果在阅读过程中发现理解不当或表达不准确的地方,可以在评论区指出。\[1\] 在PyTorch框架中,有一个非常重要且实用的包叫做torchvision。该包由三个子包组成:torchvision.datasets、torchvision.models和torchvision.transforms。这三个子包的具体介绍可以参考PyTorch官方文档中的链接:https://pytorch.org/docs/master/torchvision/datasets.html。\[2\] 最后一篇博客介绍了如何在Python调用C++代码进行高效计算,以及如何与前面的C++代码进行交互。首先简单介绍了Python的C扩展通常的写法,然后以核心数据结构Tensor和Storage为例,展示了它们如何转换为Python类型。最后还稍微介绍了一下Python自动微分函数的实现。\[3\] 整个PyTorch源码的目录结构如下: - aten: C++ Tensor - c10: 包含一些Tensor实现 - caffe2: caffe2 - tools: 包含自动微分相关函数生成工具等 - torch: Python模块,包含了C++相关源码和Python模块的实现 这个系列文章对PyTorch源码进行了详细解读,可以帮助读者更好地理解PyTorch的内部实现和工作原理。 #### 引用[.reference_title] - *1* *3* [PyTorch源码浅析:简介](https://blog.youkuaiyun.com/Xixo0628/article/details/112602624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PyTorch源码解读(四)torchvision.models](https://blog.youkuaiyun.com/sinat_42239797/article/details/94329987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值