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

在exe中使用从DLL导出的Python对象,python,c,python-extensions,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(

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

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;
}
命令提示符2(在命令提示符1中完成后)

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

  • event\u queue
    将为空,因为在执行
    CallMethod
    之前,没有调用
    set\u queue
  • PyInit\uu…
    是一个函数,而不是一个变量;您不调用它,因此模块和
    set\u队列
    甚至不存在
  • 广告编辑:


    上面仍然矗立着。您正在做的事情需要进程间通信,简单的全局变量无法完成您想要做的事情(两个进程都有自己的副本-只能共享DLL的代码,不能共享数据-在PyGlobalxe中,它是空的)。

    抱歉,澄清了用例。请参见上文。@MikeRand:已编辑。请注意,您试图做的事情并不是微不足道的。我相信已经有很多关于IPC的问题了。
    #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);
    }
    
    >>> import pyglobalextension
    >>> from queue import Queue
    >>> q = Queue()
    >>> pyglobalextension.set_queue(q)
    
    $> pyglobalexe