Я не уверен, почему все говорят о GIL здесь. Вы выпускаете это где-нибудь? Я заметил несколько возможных проблем, которые я перечислю ниже. Это смешано с предложениями.
Я заметил, что вы не увеличиваете счетчик ссылок на userData
. Почему бы и нет? Вы храните это не так ли? Почему вы хотите хранить его в кортеже? Почему бы просто не сохранить две переменные (для обратного вызова и данных), а затем увеличить их счетчики ссылок, чтобы у вас была ссылка?
Прежде всего, проверьте возвращаемые значения всех ваших функций, чтобы увидеть, являются ли они NULL
. Это позволит вам убедиться, что вы действительно работаете правильно. Также, вероятно, будет хорошей идеей использовать PyObject_Print
для печати интересующих вас объектов во всех точках кода, чтобы убедиться, что все идет так, как вы ожидаете.
Из вашего комментария о том, где происходит segfault, я предполагаю, что вы передаете неправильное количество параметров в функцию обратного вызова, когда вызываете ее с помощью PyObject_CallFunctionObjArgs
. Вы можете проверить это дважды? Может быть, покажите нам определение вашей функции обратного вызова и затем проверьте вызов снова.
Другая возможная проблема, которую я вижу, заключается в том, что из именования py_some_number
звучит так, как будто вы ожидаете целочисленный объект Python. Это не вариант. После PyArg_ParseTuple
он будет содержать целое число.