我将Python嵌入到C ++应用程序中,我还需要回调Python中的C ++代码。 我已经能够使用以下简单示例执行此操作,但我在C ++应用程序中遇到了一个奇怪的问题。
模块定义......
static PyObject*
say_hello(PyObject* self, PyObject* args)
{
const char* name;
if (!PyArg_ParseTuple(args, "s", &name))
return NULL;
printf("Hello %s!\n", name);
Py_RETURN_NONE;
}
static PyMethodDef HelloMethods[] =
{
{ "say_hello", say_hello, METH_VARARGS, "Greet somebody." },
{ NULL, NULL, 0, NULL }
};
static struct PyModuleDef hellomodule = {
PyModuleDef_HEAD_INIT,
"hello",
NULL,
-1,
HelloMethods
};
PyMODINIT_FUNC
PyInit_hello(void)
{
return PyModule_Create(&hellomodule);
}
在main()...
PyImport_AppendInittab("hello", &PyInit_hello);
// Initialize Python.
Py_Initialize();
PySys_SetArgv(argc, argv);
CPyObject pmod(PyImport_ImportModule("demo")); //CPyObject is a wrapper class
Python文件demo.py ...
import hello
hello.say_hello("something")
当我将此代码添加到我的C ++应用程序时,我在PyImport_ImportModule()处获得了读取访问冲突。 为了防止这种情况,我在导入之前包含了以下代码行。
PyObject * pmod2 = PyImport_AddModule("hello");
这允许我导入包含“import hello”的python脚本,但是我无法执行hello模块中的任何功能。
为什么PyImport_AddModule会阻止读取访问冲突?
我不是一个经验丰富的开发人员,所以我可能会犯一些非常基本的错误。 任何帮助将非常感激。
编辑
我通过添加函数来克服这个问题...
PyModule_AddFunctions(pmod2, HelloMethods);
因此,虽然我已经初始化了模块,但在导入使用该模块的脚本之前,我需要添加它和函数。 我不确定我理解为什么如果有人可以为我合理化这将是有用的。