Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将长整数从嵌入式Python返回到C++;_Python_C++ - Fatal编程技术网

无法将长整数从嵌入式Python返回到C++;

无法将长整数从嵌入式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*)

你好,我试图从嵌入的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*)"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();