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

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

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 из pyglobalextension в pyglobalexe?

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

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

Командная строка 1 (работает python.exe)

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

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

$> pyglobalexe

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

1 Ответ

2 голосов
/ 28 марта 2011
  1. event_queue будет НЕДЕЙСТВИТЕЛЕН, потому что ничто не вызвало set_queue до того, как вы CallMethod.
  2. PyInit_... - это функция, а не переменная;и вы его не называете, поэтому модуль и set_queue даже не существуют.

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

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

...