对C++ Python扩展的混淆。类似于为Python值获取C++值的东西

2024-09-30 16:38:55 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我想把一些python代码转换成C++,但是它并不像简单的C++函数和函数调用那样简单。我不知道如何从Python整数对象中获得C++整数。我有一个整数,它是我想要使用的对象的属性。我还有一些整数,它们在我需要使用的对象的列表中。在

我想用这个函数测试C++扩展:

def setup_framebuffer(surface,flip=False):
   #Create texture if not done already
   if surface.texture is None:
      create_texture(surface)
   #Render child to parent
   if surface.frame_buffer is None:
      surface.frame_buffer = glGenFramebuffersEXT(1)
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, c_uint(int(surface.frame_buffer)))
   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0)
   glPushAttrib(GL_VIEWPORT_BIT)
   glViewport(0,0,surface._scale[0],surface._scale[1])
   glMatrixMode(GL_PROJECTION)
   glLoadIdentity() #Load the projection matrix
   if flip:
      gluOrtho2D(0,surface._scale[0],surface._scale[1],0)
   else:
      gluOrtho2D(0,surface._scale[0],0,surface._scale[1])

这个函数调用CuraTyType纹理,所以我必须把这个函数传递给C++函数,我将用第三个参数来处理它。这是到目前为止我所掌握的信息,同时我还试图了解python文档的相关信息:

^{pr2}$

Tags: 对象函数noneifisbuffer整数surface
2条回答

从Python整数中获取Cint的方法是使用PyInt_AsLong()和一个向下转换(尽管您可能希望改用C long)。我不清楚您想在代码中的哪个位置执行此操作,尽管我对您的代码有一些其他注释:

  • 从概念上讲,PyObject_IsTrue()返回一个布尔值。不要将其与1比较,只需将其用作布尔值。但是,您应该检查它是否返回错误,即-1。(通常的检查是< 0)如果不检查返回的错误,则最终会吞下异常,但会留下异常对象。这很糟糕。

  • 不需要create_texturePy_XINCREF()。您有一个对args元组的引用,而元组又拥有对create_texture对象的引用。在函数返回之前,create_texture无法离开。如果要使它保持比此functioncall更长的时间,则只需要增加它。如果必须增加它,就不需要使用Py_XINCREF(),因为它永远不会为NULL。如果你真的要增加它,你需要记住在你的错误返回情况下减少它。

  • 与其创建一个参数元组来调用PyEval_CallObject(),不如调用PyObject_CallFunctionObjectArgs(create_texture, arglist, NULL)或{}。

  • Py_BuildValue("s", "frame_buffer")并不是为"frame_buffer"获取Python字符串的正确方法。更好的方法是PyString_FromString()。但是,这两种方法都返回新的引用,并且PyObject_GetAttr()不接受对属性名的引用,因此最终会泄漏该引用。您不应该使用这些,而是使用PyObject_GetAttrString(),它将属性名作为const char*

  • 记住要检查所有可以返回错误值的函数的返回值(几乎所有的Python API函数都是这样的),除了PyTrue_IsTrue()之外,Py_BuildValue()和{}也会忘记这一点。

我可以在此提出一个真诚的建议吗?在尝试类似这样的新东西时,不要向自己扔上一百行代码,首先尝试最简单的测试用例。尝试获得一个C++扩展,它只会传递值123。(选择0或1可能会意外地起作用,所以我选择了一个易于识别的不太可能是意外的值。)然后让扩展名将传入的数字加倍,然后添加两个数字,等等

偷偷摸摸地发现问题!:-)

相关问题 更多 >