Использование объекта Python, экспортируемого из DLL в exe

1

У меня есть двухчастный генератор событий:

pyglobalexe (заглушка для имитации событий):

#pragma comment(lib, "pyglobalextension.lib")

#include <Python.h>

__declspec(dllimport) PyObject* PyInit_pyglobalextension;
__declspec(dllimport) PyObject* event_queue;

int main() {
    int i;
    for(i=0; i<10; i++) {
        PyObject_CallMethod(event_queue, "put", "O", PyLong_FromLong(i*2));
    }
    return 0;
}

pyglobalextension

#include <Python.h>

__declspec(dllexport) PyObject *event_queue = NULL;

static PyObject *
set_queue(PyObject *self, PyObject *args)
{
    PyObject *temp;

    if(!PyArg_ParseTuple(args, "O", &temp)){
        return NULL;
    }
    Py_XINCREF(temp);
    Py_XDECREF(event_queue);
    event_queue = temp;
    Py_INCREF(Py_None);
    return Py_None;
}

static PyMethodDef PyGlobalExtensionMethods[] = {
    {"set_queue",  set_queue, METH_VARARGS, "Set a queue global."},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef PyGlobalExtensionModule = {
   PyModuleDef_HEAD_INIT,
   "pyglobalextension",
   NULL,
   -1,
   PyGlobalExtensionMethods
};

PyMODINIT_FUNC
PyInit_pyglobalextension(void)
{
    return PyModule_Create(&PyGlobalExtensionModule);
}

Оба файла скомпилированы. pyglobalexe.exe сбой при вызове PyObject_CallMethod. Что мне нужно изменить, чтобы я мог использовать event_queue global из pyglobalextension в pyglobalexe?

=== РЕДАКТИРОВАТЬ ===

Извините, должен был сделать использование более понятным.

Командная строка 1 (запуск python.exe)

>>> import pyglobalextension
>>> from queue import Queue
>>> q = Queue()
>>> pyglobalextension.set_queue(q)

Командная строка 2 (как только я закончил в командной строке 1).

$> pyglobalexe

Я надеялся, что смогу вернуться к командной строке 1 и q.get() 10 номеров.

Теги:
python-extensions

1 ответ

2
Лучший ответ
  • event_queue будет NULL, потому что ничего не вызвало set_queue, прежде чем вы выполните CallMethod.
  • PyInit_... - это функция, а не переменная; и вы его не называете, поэтому модуль и set_queue даже не существуют.

Ad. Редактирование:

Выше все еще стоит. То, что вы делаете, требует межпроцессного общения, простая глобальная переменная не будет делать то, что вы хотите (оба процесса имеют свою собственную копию), только код DLL может быть общим, данных нет - и в pyglobalexe это NULL).

  • 0
    Извините, уточнил вариант использования. Смотри выше.
  • 0
    @MikeRand: отредактировано. Обратите внимание, что то, что вы пытаетесь сделать, не тривиально. Я уверен, что уже есть много вопросов IPC по SO.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню