<p>从Python整数中获取C<code>int</code>的方法是使用<code>PyInt_AsLong()</code>和一个向下转换(尽管您可能希望改用C long)。我不清楚您想在代码中的哪个位置执行此操作,尽管我对您的代码有一些其他注释:</p>
<ul>
<li><p>从概念上讲,<code>PyObject_IsTrue()</code>返回一个布尔值。不要将其与1比较,只需将其用作布尔值。但是,您应该检查它是否返回错误,即-1。(通常的检查是<code>< 0</code>)如果不检查返回的错误,则最终会吞下异常,但会留下异常对象。这很糟糕。</p></li>
<li><p>不需要<code>create_texture</code>的<code>Py_XINCREF()</code>。您有一个对<code>args</code>元组的引用,而元组又拥有对<code>create_texture</code>对象的引用。在函数返回之前,<code>create_texture</code>无法离开。如果要使它保持比此functioncall更长的时间,则只需要增加它。如果必须增加它,就不需要使用<code>Py_XINCREF()</code>,因为它永远不会为NULL。如果你真的要增加它,你需要记住在你的错误返回情况下减少它。</p></li>
<li><p>与其创建一个参数元组来调用<code>PyEval_CallObject()</code>,不如调用<code>PyObject_CallFunctionObjectArgs(create_texture, arglist, NULL)</code>或{<cd14>}。</p></li>
<li><p><code>Py_BuildValue("s", "frame_buffer")</code>并不是为<code>"frame_buffer"</code>获取Python字符串的正确方法。更好的方法是<code>PyString_FromString()</code>。但是,这两种方法都返回新的引用,并且<code>PyObject_GetAttr()</code>不接受对属性名的引用,因此最终会泄漏该引用。您不应该使用这些,而是使用<code>PyObject_GetAttrString()</code>,它将属性名作为<code>const char*</code>。</p></li>
<li><p>记住要检查所有可以返回错误值的函数的返回值(几乎所有的Python API函数都是这样的),除了<code>PyTrue_IsTrue()</code>之外,<code>Py_BuildValue()</code>和{<cd18>}也会忘记这一点。</p></li>
</ul>