在exe中使用从DLL导出的Python对象
我有一个由两部分组成的事件生成器: pyglobalexe(模拟事件的存根):在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(
#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