擅长:python、mysql、java
<p>在我看来,<a href="https://docs.python.org/2/library/ctypes.html" rel="nofollow noreferrer">^{<cd1>}</a>和SWIG <a href="http://www.swig.org/Doc1.3/Typemaps.html" rel="nofollow noreferrer">^{<cd2>}</a>的组合将是解决问题的最简单方法。<code>ctypes</code>使生成调用Python可调用的C函数变得容易。Python代码应该如下:</p>
<pre><code>import example
# python callback
def py_callback(i, s):
print( 'py_callback(%d, %s)'%(i, s) )
example.use_callback(py_callback)
</code></pre>
<p>在SWIG端,我们有:(1)一个Python函数<code>use_callback</code>,它用<code>ctypes</code>包装器包装Python回调,并将包装器的地址作为一个整数传递给<code>_example.use_callback()</code>,以及(2)一个SWIG <code>typemap</code>,它提取地址并将其强制转换到适当的函数指针。在</p>
^{pr2}$
<p>您可以在这个完整的示例中找到一个CMakeLists.txt文件文件<a href="https://gist.github.com/sterin/32b5c7c42a177dacf455" rel="nofollow noreferrer">here</a>。在</p>
<p>编辑:合并@Flexo建议将Python部分移到SWIG文件的%pythoncode块中。在</p>
<p>编辑:incorporated@user87746关于python3.6+兼容性的建议。在</p>