1

私は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の数字に戻ることができると期待していました。

4

1 に答える 1

2
  1. event_queueset_queueを実行する前に何も呼び出されていないため、NULLになりますCallMethod
  2. PyInit_...関数であり、変数ではありません。そしてあなたはそれを呼ばないので、モジュールとはset_queue存在しません。

広告。編集:

上はまだ立っています。あなたがしていることはプロセス間通信を必要とします、単純なグローバル変数はあなたがしたいことをしません(両方のプロセスはそれの独自のコピーを持っています— DLLのコードだけが共有されるかもしれません、データは共有されません—そしてpyglobalexeではそれはNULLです)。

于 2011-03-28T17:32:40.323 に答える