Cython в первую очередь предназначен для создания модулей расширения Python и на самом деле не предназначен для поддержки других API-интерфейсов плагинов. Однако, если вы готовы вручную настроить выход, вы можете получить что-то разумное.
Например, вы могли бы вручную написать небольшой C-заглушку для инициализации модуля в качестве GStreamer плагина:
#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/"
)
Вы можете экспортировать эту register_plugin
функции из вашего Cython модуля:
cdef public int register_plugin(void *plugin):
# use the gstreamer API in here to register your plugin
Однако, это еще не вся история. Чтобы это сработало, вам нужно как-то убедить gstreamer загрузить libpython
в свой процесс, поскольку cython зависит от него даже для инициализации. Вероятно, вам нужно будет инициализировать интерпретатор Python немного раньше, чем ваш код будет работать по вашему желанию. Вам нужно будет определить заглушки cython для всех API-интерфейсов регистрации плагина gstreamer, которые вы хотите использовать. И если кто-то еще попытался сделать то же самое в том же процессе gstreamer, он, вероятно, все развалится.
Таким образом, при всем этом сказано, что более простой путь может состоять в том, чтобы сделать плагин gstreamer, который соединяется с кодом Python, а затем использовать этот плагин для доступа к вашему модулю cython. Таким образом, вложение python является явным, и вы сможете правильно инициализировать интерпретатор Python перед загрузкой кода. Такой плагин может быть полезен для других людей, которые пытаются выполнить аналогичные проекты с вашими, используя cython или модуль ctypes
.
Такой плагин был бы фактически перевернутым PyGST: он загрузил бы Python в качестве библиотеки в GStreamer, вместо того, чтобы загружать GStreamer в качестве библиотеки в Python. Вероятно, есть какой-то код PyGST, который вы могли бы повторно использовать для этой цели, но у вас все еще есть ограничение на то, что каждый процесс может содержать только один Python, поэтому для использования нескольких модулей с использованием этого механизма все должны использовать один и тот же интерпретатор Python, несколько приложений загружаются в модуль mod_python
для веб-сервера Apache.
Иными словами, «Это слишком сложный чувак!». –