Обновление переменной python из c - PullRequest
0 голосов
/ 09 февраля 2010

У меня периодически возникает ошибка, приводящая к сбою моего модуля Python, и я предполагаю, что это происходит из-за ошибки памяти, вызванной неправильным подсчетом ссылок в коде cУ меня есть немного кода, который получает ответ в случайное время из удаленного места.На основании полученных данных необходимо обновить переменную данных, к которой я должен иметь доступ в Python.Какой лучший способ сделать это?Следующий код выполняется большую часть времени, и он работает правильно, когда он работает, но когда он не работает, происходит сбой Python (вызывает окно отладки Visual Studio).Спасибо.

if (event == kResponseEvent) {
    list = PyList_New(0);

    for (i = 0; i < event->count; i++) {
        PyList_Append(list, Py_BuildValue("{s:i, s:s}",
                                          "id", event->id,
                                          "name", event->name));
    }

    PyModule_AddObject(module, "names", list);
}

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

PyList_New() может вернуть NULL, чтобы указать на ошибку, которую вы не проверяете. Py_BuildValue() может вернуть NULL, чтобы указать на ошибку, которую вы не проверяете. PyList_Append() может вернуть -1, чтобы указать на ошибку, которую вы также не проверяете. PyList_Append() не крадет ссылку, поэтому вы пропускаете ссылку на диктат, возвращенный Py_BuildValue(). Последнее может быть причиной того, что вам не хватает памяти, что может привести к сбою Py_BuildValue() или PyList_Append(), а ваша неспособность обработать ошибку может вызвать сбой.

(Что-то еще может вызвать сбой Py_BuildValue() или PyList_Append(), но об этом трудно догадаться только из этого фрагмента.)

1 голос
/ 09 февраля 2010

PyModule_AddObject() ворует ссылка. Таким образом, вы не должны быть списком после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...