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通话中崩溃。我必须更改什么才能在 pyglobalexe 中使用来自 pyglobalextension 的 event_queue 全局?

===编辑===

对不起,应该使用例更清楚。

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

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

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

$> pyglobalexe

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

4

1 回答 1

2
  1. event_queueset_queue将为 NULL,因为在你做之前没有调用任何东西CallMethod
  2. PyInit_...是一个函数,而不是一个变量;而且您不调用它,因此模块set_queue甚至不存在。

广告。编辑:

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

于 2011-03-28T17:32:40.323 回答