c++能调用python吗,c程序调用python
C或C调用python一般可以通过使用python自己的库来完成。首先添加python.h的头文件,链接时添加相应的库。
但是在C/C程序中使用python的类时,会遇到很多坑,在网上搜索会得到很多类似的方法,如下图。
首先声明,以下的方法是有问题的,有问题的地方我会使用红字标出
注: 下述所有导入方法在导入失败时不会报错, 只会返回空指针.
第一步是导入。py文件:
使用PyObject* pModule存储导入的。py文件模块。被调用的方法是py import _ import module(path):py object * p module=py import _ import module( testpy );使用PyObject* pDict在导入模块中存储方法字典,调用的方法为py module _ get dict(module):py object * pDict=py module _ get dict(p module);这就完成了。py文件。
第二步是在导入的模块中导入方法或类:
获取方法,调用的方法为pydict _ getitemstring (dict,method name):py object * pfun hi=pydict _ getitemstring(pdct, say hi );获取类并调用与上面相同的方法。请注意,红色主体中的字符串对应于。py文件:py object * pclassssecond=pydict _ getitemstring(PDICT,秒);第三步是使用导入的方法或类:
用方法,只需调用pyobject _ call函数(pfunc, s ,args): pyobject _ call函数(pfunhi, s , lhb );使用类构造对象,只需调用py instance _ new(pclassssecond,null,null):py object * pinstancesecond=py instance _ new(pclassssecond,null,null);注意pClassSecond是2.2步中获取的类指针的类对象的方法,只需调用py object _ call method(pin instance,methodname, o ,args):py object _ call method(Pinstancesecond, invoke , o ,Pinstanceperson);上面调用中的“s”和“o”代表参数列表的类型。我们可以在Py_BuildValue中找到所有的类型。该表也附在本文的末尾。PyInstance_New是python2使用的函数,而python3使用的是新函数PyInstanceMethod_New。国内很多文章都认为这两个函数返回的是类的实例对象,其实不然。他们返回010-的类。
当不涉及修改类的成员变量时,遵循上面文章中的步骤没有问题。如果有python类
类测试:def _ _ init _ _(self):self . I=1 print( init!)def modify(self):self . I=1 def do(self):print(self . I)如果用上面的方法来使用这个类,调用do方法不会有问题,可以打印成功。但是如果调用modify,会得到一个错误,PyErr_Print会打印一个错误信息I不存在。
并且当PyInstance_New或PyInstanceMethod_New!表示根本没有调用构造函数。
正确的称呼应该是
py object * pConstruct=PyInstanceMethod _ New(pClass);py object * pIns=py object _ call object(pConstruct,nullptr);PyObject_CallMethod(pIns, modify ,nullptr);PyObject_CallMethod(pIns, do ,nullptr);在使用PyInstanceMethod_New获得构造函数之前,不能构造对象,调用时也不需要传递自己。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。