无法将长整数从嵌入式Python返回到C++;
你好,我试图从嵌入的Python返回一个值(119599936)到C++ +/p>无法将长整数从嵌入式Python返回到C++;,python,c++,Python,C++,你好,我试图从嵌入的Python返回一个值(119599936)到C++ +/p> Py_Initialize(); PyObject* myModuleString = PyString_FromString((char*)"memory_leak_test"); PyObject* myModule = PyImport_Import(myModuleString); PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)
Py_Initialize();
PyObject* myModuleString = PyString_FromString((char*)"memory_leak_test");
PyObject* myModule = PyImport_Import(myModuleString);
PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"begin");
PyObject* args = PyTuple_Pack(1,PyString_FromString("CacheSetup"));
PyObject* myResult = PyObject_CallObject(myFunction, args);
double result = PyFloat_AsDouble(myResult);// <<<<<<<<< I guess thts where i'm goin wrong
std::cout << result << std::endl;
Py_Finalize();
当我试图返回号码119599936时,上面的这些似乎都不起作用,我得到的错误是
Exception SystemError: '..\\Objects\\longobject.c:739: bad argument to internal
function' in 'garbage collection' ignored
Fatal Python error: unexpected exception during garbage collection
由于您的代码不执行任何错误检查,并且您没有向
内存泄漏测试模块提供源代码,因此任何人都可以猜测出哪里出了问题。我猜是内存泄漏测试
导入失败,或者内存泄漏测试。begin(“CacheSetup”)
引发异常或返回无
,而不是返回代码期望的数字
要调试此问题,请按照以下指导原则重写:
- 检查Python/C函数中可能返回的错误。每当出现无法处理的错误时,调用并终止当前执行(除非您预期会出现错误并希望正确处理它-在这种情况下,请改为调用)
- 在不再需要对象时对其进行调用。例如
PyString\u FromString
、PyTuple\u Pack
和PyObject\u CallOject
的返回值
- 了解并使用诸如和之类的方便函数,这些函数大大减少了创建临时字符串和元组的样板代码。找到这些代码的最佳方法是仔细阅读现有的Python/C源代码,例如Python附带的源代码
- 用于打印调试的中间结果
以下是根据上述内容对您的代码可能进行的修改:
Py_Initialize();
PyObject *module = PyImport_ImportModule("memory_leak_test");
if (!module) {
PyErr_Print();
return;
}
PyObject *result = PyObject_CallMethod(module, "begin", "s", "CacheSetup");
Py_DECREF(module);
if (!result) {
PyErr_Print();
return;
}
printf("got result of type %s\n", Py_TYPE(result)->tp_name);
PyObject_Print(result, stdout, 0);
putchar('\n');
Py_DECREF(result);
Py_Finalize();
Py_Initialize();
PyObject *module = PyImport_ImportModule("memory_leak_test");
if (!module) {
PyErr_Print();
return;
}
PyObject *result = PyObject_CallMethod(module, "begin", "s", "CacheSetup");
Py_DECREF(module);
if (!result) {
PyErr_Print();
return;
}
printf("got result of type %s\n", Py_TYPE(result)->tp_name);
PyObject_Print(result, stdout, 0);
putchar('\n');
Py_DECREF(result);
Py_Finalize();