изменить список питонов из переполнения стека

Я получил список Python, в котором я могу получить его указатель и передать этот адрес указателя в C ++ для работы

MyPointer = TheList.as_pointer()

сейчас я передаю этот адрес в C ++ с ctypes

в C ++ я могу сделать следующее:

*(float*) MyPointer = 2.0f; //for example

и значения Python будут обновлены немедленно, теперь проблема заключается в следующем:
как расширить или удалить некоторые значения (например, изменить список непосредственно из C ++)
как я чувствую, эти данные std::vector как сделать push_back и так далее, чтобы скорректировать размер быстрым способом (поскольку итерации в Python в значительной степени МЕДЛЕННЫ)

3

Решение

Учитывая только этот указатель, вы не можете расширить список. То, что вы переходите на C ++, является адресом массив внутренне используется для реализации списка Python. Это не может быть std::vector, поскольку списки Python реализованы не как векторы STL, а как массивы C-уровня ссылок на объекты Python. Эти массивы не содержат обратного указателя на объект списка Python.

Чтобы изменить список, взгляните на документация и свяжите ваш код C ++ с библиотекой Python. Если вы действительно должны вызывать свою функцию C ++ из ctypes, вызывайте ее с помощью id списка списка, чтобы получить указатель на список, в отличие от его элемента массива. Затем вы можете работать со списком следующим образом:

#include <Python.h>

extern "C"void append_to_list(uintptr_t lst_id)
{
PyObject* lst = reinterpret_cast<PyObject*>(ptr);
PyObject* new_num = PyFloat_FromDouble(2.0);
if (!new_num) {
... PyFloat creation failed ...
}
int ret = PyList_Append(lst, new_num);
Py_DECREF(new_num);
if (ret) {
... PyList_Append failed ...
}
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]