首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将C++指针作为参数传递给Cython函数

将C++指针作为参数传递给Cython函数
EN

Stack Overflow用户
提问于 2012-08-31 03:53:17
回答 4查看 6.3K关注 0票数 23
代码语言:javascript
复制
cdef extern from "Foo.h":
    cdef cppclass Bar:
        pass

cdef class PyClass:
    cdef Bar *bar

    def __cinit__(self, Bar *b)
        bar = b

这将总是给我一些类似的东西:

Cannot convert Python object argument to type 'Bar *'

有没有办法做到这一点,或者我是否需要从Bar对象中提取所有内容,创建一个Python等效项,传递给它,然后在PyClass中重新构造它

EN

回答 4

Stack Overflow用户

发布于 2014-05-02 04:33:15

我在尝试用结构将C代码包装为python类时遇到了这个问题。问题似乎是,包括__init____cinit__在内的“特殊”函数必须声明为def而不是cdef。这意味着它们可以从普通的python中调用,所以类型参数实际上被忽略了,所有的东西都被当作对象来处理。

在J.F.Sebastian的回答中,修复方法不是包装- double是一种基本的数字类型,因此在C/C++类型和Python对象之间存在默认转换。Czarek的答案基本上是正确的--你需要使用一个假的构造函数,使用一个全局函数。不能使用@staticmethod修饰器,因为它们不能应用于cdef函数。在提供的原始示例中,答案看起来更简单。

代码语言:javascript
复制
cdef extern from "Foo.h":
    cdef cppclass Bar:
        pass

cdef class PyClass:
    cdef Bar *bar

cdef PyClass_Init(Bar *b):
    result = PyClass()
    result.bar = b
    return result
票数 10
EN

Stack Overflow用户

发布于 2015-09-27 20:08:41

Cython 0.21中,可以使用@staticmethod装饰器来声明cdef方法。这允许静态创建者方法接受非Python参数:

代码语言:javascript
复制
cdef extern from "Foo.h":
    cdef cppclass Bar:
        pass

cdef class PyClass:
    cdef Bar *bar

    @staticmethod
    cdef create(Bar *bar):
        cdef PyClass pc = PyClass()
        pc.bar = bar
        return pc
票数 8
EN

Stack Overflow用户

发布于 2012-08-31 04:55:40

对于每个cdef类,创建一个充当构造函数的全局cdef函数,CefResponse是一个C++对象,PyResponse是c++对象的python等效项:

代码语言:javascript
复制
cdef object CreatePyResponse(CefRefPtr[CefResponse] cefResponse):

    pyResponse = PyResponse()
    pyResponse.cefResponse = cefResponse
    return pyResponse

cdef class PyResponse:

    cdef CefRefPtr[CefResponse] cefResponse

    def GetStatus(self):

        return (<CefResponse*>(self.cefResponse.get())).GetStatus()

所以调用resp = CreatePyResponse(cppObject)而不是resp = PyResponse(cppObject)

取自CEF Python的示例:https://code.google.com/p/cefpython/source/browse/cefpython/response.pyx?r=0250b65e046a

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12204441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档