Python C Api передает PyObject * в массив c

Я использовал python c api и хочу вернуть массив из python. Я вернул массив python со стороны python и хочу передать результат PyObject* в массив c, чтобы я мог его использовать.

В любом случае я могу это сделать?

Побочные вопросы: в каких обстоятельствах пытаются вернуть элемент в массиве, например

return arr[3]

приведет к тому, что PyObject_callobject вернет NULL?

return arr

дает мне что-то


person Hongjun Han    schedule 01.02.2016    source источник
comment
Когда вы говорите, что хотите передать результат PyObject * в массив C, вы имеете в виду массив C PyObject * или вы хотите также преобразовать эти объекты-члены массива в более родное представление C?   -  person Ken Clement    schedule 02.02.2016
comment
@KenClement Я бы тоже сказал, наверное. Если я не ошибаюсь, я могу использовать Pystring_fromstring для перевода его члена отдельно. Кстати, когда я набираю (arr[3]) в python, он говорит мне, что это юникод. Имеет ли это какое-то значение для строки?   -  person Hongjun Han    schedule 02.02.2016
comment
Вы на правильном пути в использовании Pystring_fromstring, но не имеет значения, какую версию Python вы используете (2.7 или 3.5). (Кроме того, я, вероятно, должен спросить, используете ли вы CPython, IronPython или PyPy - я предполагаю из ваших замечаний, что это CPython) Разница между 2.7 и 3.5 будет определять, имеет ли значение unicode разница с str. В CPython 2.7 str обычно имеет дело с узкими символьными данными, а не с юникодом. В 3.5 это различие было стерто (все строки в юникоде). AP{I's несовместимы в этом отношении. На какой ты версии?   -  person Ken Clement    schedule 02.02.2016


Ответы (1)


В Python «массив» — это тип данных list. Посмотрите на функции PyList_* в C API. Вы можете найти эту ссылку здесь для 2.7 и здесь для версии 3.5. Интересующие функции:

Py_ssize_t PyList_Size(PyObject *list) для получения количества членов списка и PyObject* PyList_GetItem(PyObject *list, Py_ssize_t index) для получения ссылки на элемент по этому индексу.

Простое использование malloc или аналогичного распределителя и цикла for должно помочь.

Также обратите внимание, что задействованы только заимствованные ссылки, поэтому ведение счетчика ссылок этих объектов через void Py_INCREF(PyObject *o) и void Py_DECREF(PyObject *o) не требуется.

person Ken Clement    schedule 01.02.2016