我有一个由两部分组成的事件生成器:
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个数字。
答案 0 :(得分:2)
event_queue
将为NULL,因为在set_queue
之前没有任何内容调用CallMethod
。PyInit_...
是一个函数,而不是一个变量;并且你没有调用它,因此模块和set_queue
甚至不存在。广告。编辑:
上面仍然有效。你正在做什么需要进程间通信,简单的全局变量将不会做你想做的事情(两个进程都有自己的副本 - 只有DLL的代码可以共享,数据不是 - 在pyglobalexe中,它是NULL)。