<p>为了得到一个规范的答案,我将回答我自己的问题,这要感谢@eryksun的指导。在</p>
<p>因此,首先,虽然这在<a href="https://docs.python.org/2/library/ctypes.html#callback-functions" rel="nofollow">documentation</a>中并不清楚,但不能从回调函数返回复杂类型。因此,不能映射C函数指针:</p>
<pre><code>struct format {
struct format * (*open)(const char *filename);
};
</code></pre>
<p>到</p>
^{pr2}$
<p>上面的代码可以很好地编译,但是在运行时,可以得到:</p>
<pre><code>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: invalid result type for callback function
</code></pre>
<p>长话短说的答案是:</p>
<blockquote>
<p>The TypeError message you get when trying to use a non-simple type as
the result of a callback is less than helpful. A callback's result
type has to have a setfunc in its StgDictObject (a ctypes extension of
the regular PyDictObject). This requirement restricts you to using a
simple type such as c_void_p[...]</p>
</blockquote>
<p>因此,到今天为止,在<a href="http://bugs.python.org/issue5710" rel="nofollow">issue 5710</a>修复之前,唯一的解决方案是:</p>
<pre><code>class python_format(ctypes.Structure):
__self_ref = []
def __init__(self):
self.open = self.get_open_func()
# technically should be a @classmethod but since we are self-referencing
# ourself, this is just a normal method:
def get_open_func(self):
def py_open_func( string ):
python_format.__self_ref.append( self )
return ctypes.addressof(self)
return OPENFUNC( py_open_func )
OPENFUNC = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p)
# delay init required because `read_info` requires a forward declaration:
python_format._fields_ = (
('open', OPENFUNC),
)
</code></pre>