在exe中使用从DLL导出的Python对象

时间:2011-03-28 17:27:53

标签: python c python-extensions

我有一个由两部分组成的事件生成器:

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调用时崩溃。我需要更改什么才能在pyglobalexe中使用pyglobalextension中的event_queue全局?

=== EDIT ===

抱歉,应该更清楚地使用例。

命令提示符1(运行python.exe)

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

命令提示符2(一旦我在命令提示符1中完成)。

$> pyglobalexe

我希望我能够回到命令提示符1和q.get()10个数字。

1 个答案:

答案 0 :(得分:2)

  1. event_queue将为NULL,因为在set_queue之前没有任何内容调用CallMethod
  2. PyInit_...是一个函数,而不是一个变量;并且你没有调用它,因此模块和set_queue甚至不存在。
  3. 广告。编辑:

    上面仍然有效。你正在做什么需要进程间通信,简单的全局变量将不会做你想做的事情(两个进程都有自己的副本 - 只有DLL的代码可以共享,数据不是 - 在pyglobalexe中,它是NULL)。