<p>Cython主要是为生成Python扩展模块而设计的,并不是真正支持其他插件api。然而,如果你愿意手工调整输出,你也许可以得到一些合理的东西。在</p>
<p>例如,您可以手工编写一个小的C存根,将模块初始化为gstreamer插件:</p>
<pre><code>#include "Python.h"
#include "gst_plugin.h"
static gboolean plugin_init (GstPlugin *plugin) {
// initialize the extension module
#if PY_MAJOR_VERSION < 3
initgstreamer();
#else
PyInit_gstreamer();
#endif
// call into function exported from cython module
return register_plugin(plugin);
}
GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
my_filter,
"My filter plugin",
plugin_init,
VERSION,
"LGPL",
"GStreamer",
"http://gstreamer.net/"
)
</code></pre>
<p>然后可以从cython模块导出<code>register_plugin</code>函数:</p>
^{pr2}$
<p>然而,这并不是全部。为了使其工作,您必须设法说服gstreamer将<code>libpython</code>加载到其进程中,因为cython甚至依赖它来初始化。您可能需要先初始化Python解释器,然后代码才能按您的要求运行。您需要为所有要使用的gstreamer插件注册api定义cython存根。如果其他人试图在同一个gstreamer进程中执行相同的操作,那么很可能会崩溃。在</p>
<p>尽管如此,一个更直接的方法可能是制作一个连接到Python代码的gstreamer插件,然后使用该插件访问cython模块。这样python嵌入是显式的,您将有机会在加载代码之前正确初始化python解释器。这样的插件对于其他人来说可能很有用,不管是使用cython还是使用<code>ctypes</code>模块来完成类似的项目。在</p>
<p>这样的插件实际上是一个颠倒的PyGST:它将Python作为库加载到GStreamer中,而不是将GStreamer作为库加载到Python中。可能有一些PyGST代码可以重复使用,但是每个进程只能包含一个Python,因此使用这种机制的多个模块都需要共享同一个Python解释器,就像将多个应用程序加载到Apache web服务器的<code>mod_python</code>模块时一样。在</p>