从py到c以及从c到py的编组

时间:2011-10-21 13:31:09

标签: python cython

在cython中,自动完成int或char等类型的编组, 但如果我使用

       cdef struct MyClass_Tag:
            pass
      ctypedef MyClass_Tag* MyClass_ptr
      ....
      cdef class MyClass:
           cdef MyClass_ptr obj
           ....

现在包装任何函数,例如c中的函数foo,需要

      foo(char* , MyClass_ptr self)
           #return stuff

要包装此功能,我会这样做:

       def py_foo(char* n, self):
            return foo(n,self.obj)

所以从py到c:

       char is done automatically
       but self is of type MyClass so to call the foo i have to write self.obj , 
       so i pass the same obj

这里是从py到c的编组发生的地方

问题是我不明白从c到py的编组在哪里发生, 我的意思是它发生在哪一点?

即使在这种情况下,即使你给我一些其他的例子也没关系。 谢谢!

2 个答案:

答案 0 :(得分:0)

我没有完全理解你的问题,但你可能想要使用命令:

cython -a <yourfile.pyx>

然后,使用您的webbrowser打开生成的内容。你会看到cython如何将你的代码翻译成C,然后找到你的答案:)

答案 1 :(得分:0)

由于参数名self表明C foo()函数作为Python中的方法可能更有意义:

cdef extern void c_foo "foo" (char* n, MyClass_ptr)

cdef class MyClass:
   cdef MyClass_ptr this

   def foo(self, unicode n not None):
       b = n.encode('ascii')
       cdef char* p = b
       c_foo(p, self.this)

另见Wrapping C library

Cython将您的代码转换为C(或C ++)。此时你可以忘记它的存在。生成的C代码是Python的普通C扩展。此代码包含普通的Python C API调用,例如PyBytes_AsString()(将Python bytes转换为char*)或PyInt_FromLong()(将C int转换为Python整数)。 / p>

MyClass_ptr按原样使用:

struct __pyx_obj_3foo_MyClass {
  PyObject_HEAD
  MyClass_ptr this; /* <-- using MyClass_ptr as is */
};

,即纯Python代码永远不会看到它,所以没有从/到Python对象的转换。