【问题标题】:Using Python object exported from DLL in an exe在 exe 中使用从 DLL 导出的 Python 对象
【发布时间】:2011-03-28 17:27:53
【问题描述】:

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

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 个数字。

【问题讨论】:

    标签: python c python-extensions


    【解决方案1】:
    1. event_queue 将为 NULL,因为在您调用 CallMethod 之前没有调用 set_queue。
    2. PyInit_... 是函数,不是变量;而你不调用它,所以模块和 set_queue 甚至都不存在。

    广告。编辑:

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

    【讨论】:

    • 对不起,澄清了用例。见上文。
    • @MikeRand:已编辑。请注意,您尝试做的事情并非微不足道。我敢肯定已经有很多关于 SO 的 IPC 问题了。
    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2010-10-14
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多