私は2つの部分からなるイベントジェネレータを持っています:
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_queueglobalを使用できるようにするには、何を変更する必要がありますか?
===編集===
申し訳ありませんが、ユースケースをより明確にする必要がありました。
コマンドプロンプト1(python.exeを実行)
>>> import pyglobalextension
>>> from queue import Queue
>>> q = Queue()
>>> pyglobalextension.set_queue(q)
コマンドプロンプト2(コマンドプロンプト1で完了したら)。
$> pyglobalexe
コマンドプロンプト1とq.get()10の数字に戻ることができると期待していました。