我正在迁移嵌入python的应用程序,从2.7版到3.3版。该应用程序通过使用适当的数据调用Py_InitModule()
使脚本可用。只是为了惹恼像我这样的穷人,api在python 3中被删除,取而代之的是PyModule_Create
,这需要一个相当复杂的结构。
当我使用python2 api时,一切正常,当我使用新的v3时,api加载正常(返回一个有效的指针),但在脚本中使用公开的函数会产生错误:
// ImportError:没有名为'emb'的模块
其中emb是我的模块名称。很烦人!我已经包含了两个版本,也许有人可以提供帮助。 我按照移植指南进行了操作:
http://docs.python.org/3/howto/cporting.html
与我完全一样。 api改变的原因超出了我的范围。
static int numargs=0;
static PyObject*
emb_numargs(PyObject *self, PyObject *args) //what this function does is not important
{
if(!PyArg_ParseTuple(args, ":numargs"))
return NULL;
return Py_BuildValue("i", numargs);
}
static PyMethodDef EmbMethods[] = {
{"numargs", emb_numargs, METH_VARARGS,
"Return the number of arguments received by the process."},
{NULL, NULL, 0, NULL}
};
#ifdef PYTHON2
//works perfect with Pytho 27
Py_InitModule("emb", EmbMethods);
PyRun_SimpleString(
"import emb\n"
"print(emb.numargs())\n"
);
#else
static struct PyModuleDef mm2 = {
PyModuleDef_HEAD_INIT,
"emb",
NULL,
sizeof(struct module_state),
EmbMethods,
NULL,
0,
0,
NULL
};
//does not work with python 33:
//ImportError: No module named 'emb'
PyObject* module = PyModule_Create(&mm2);
PyRun_SimpleString(
"import emb\n"
"print(emb.numargs())\n"
);
#endif
答案 0 :(得分:2)
基于this issue,它们似乎已经改变了导入模块has also changed的方式。
以下是希望对您有用的内容:
// this replaces what is currently under your comments
static PyObject*
PyInit_emb(void)
{
return PyModule_Create(&mm2);
}
numargs = argc;
PyImport_AppendInittab("emb", &PyInit_emb);