У меня есть этот простой код для запуска небольшого кода python в C:
Py_Initialize();
string_module = PyUnicode_FromString((char *) "kmer_counter");
module = PyImport_Import(string_module);
function = PyObject_GetAttrString(module, (char *) "counter");
result = PyObject_CallFunction(function, "i", 5);
if ( !result ) {
fprintf(stderr, "Exception:\n");
PyErr_PrintEx(0);
exit(1);
}
Py_DECREF(string_module);
Py_DECREF(module);
Py_DECREF(function);
Py_DECREF(result);
Py_Finalize();
Я тестирую код с помощью valgrind, и у меня есть утечка памяти (здесь выход). После некоторого теста я обнаружил, что утечки памяти вызваны инструкцией Py_Initialize();. Как я могу решить эту проблему?
Я запускаю valgrind с этим флагом:
valgrind --tool=memcheck --leak-check=full ./exe
@ Jean-FrançoisFabre Как мне это указать?
установить новую версию питона. Вывод показывает, что вы используете 2.7
@Jean-FrançoisFabre Я установил python3.7, но если я использую этот флаг -I/usr/include/python3.7 -lpython3.7, он не находит библиотеку
это -lpython37 наверное. И -I для компиляции включает, нужен путь ссылки -L
@Jean-FrançoisFabre Я пытаюсь использовать ваши предложения, но это ошибка: ld: warning: directory not found for option '-L/usr/include/python3.7' ld: library not found for -lpython37
-L нужен каталог существующий, в котором находится библиотека, а не включение.
@Jean-FrançoisFabre Как найти правильный путь к библиотеке для Linux и macOS?






Выделенный вами вывод (в основном) не утечка памяти, а скорее неверное чтение. Скорее всего, они вызваны особым образом python управляет своей памятью.
В составе исходных файлов Python вы должны найти файл подавления для valgrind, это должно подавить эти сообщения, так как они не являются реальными ошибками.
Для моей версии Python 3.6.6 он находится в Python-3.6.6/Misc/valgrind-python.supp.
Итак, запустите свою программу под valgrind, используя: valgrind --suppressions=path/to/the/python/Misc/valgrind-python.supp
Вам также может сначала понадобиться сделать: экспортировать PYTHONMALLOC=malloc
можете ли вы проверить более новую версию python (например, python 3.7?), чтобы увидеть, сохраняется ли проблема?