无法将嵌入式Python中的长整数返回给C ++

时间:2014-06-30 14:50:28

标签: python c++

您好我正在尝试从嵌入式python返回值(119599936)到C ++

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();

我试过

unsigned long result = PyLong_AsUnsignedLong(myResult);
unsigned long long result = PyLong_AsUnsignedLongLongMask(myResult);
double result = PyLong_AsDouble(myResult2);

当我尝试返回号码119599936时,以上所有内容似乎都无效,我得到的错误是

Exception SystemError: '..\\Objects\\longobject.c:739: bad argument to internal
function' in 'garbage collection' ignored
Fatal Python error: unexpected exception during garbage collection

1 个答案:

答案 0 :(得分:1)

由于您的代码不会执行任何错误检查,并且您没有向memory_leak_test模块提供来源,因此任何人都可以猜出出了什么问题。我的猜测是memory_leak_test无法导入,或memory_leak_test.begin("CacheSetup")引发异常或返回None而不是返回代码所需的数字。

要调试此问题,请记住以下准则重写:

  • 检查可能返回的Python / C函数中的错误。每当出现您无法处理的错误时,请调用PyErr_Print()并终止当前执行(除非您预期错误并希望正确处理它 - 在这种情况下,请改为调用PyErr_Clear()。)< / p>

  • 在您不再需要它们时,以Py_DECREF返回的对象上调用new references。这些示例包括PyString_FromStringPyTuple_PackPyObject_CallOject的返回值。

  • 了解并使用便捷功能,例如PyObject_CallFunctionPyObject_CallMethodPyImport_ImportModule,这些功能可显着减少用于创建临时字符串和元组的样板代码。找到这些的最好方法是仔细阅读现有的Python / C源代码,例如Python附带的源代码。

  • 使用PyObject_Print()打印中间结果以进行调试。

根据以上内容,您可以对代码进行修改:

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();