Я получил список Python, в котором я могу получить его указатель и передать этот адрес указателя в C ++ для работы
MyPointer = TheList.as_pointer()
сейчас я передаю этот адрес в C ++ с ctypes
в C ++ я могу сделать следующее:
*(float*) MyPointer = 2.0f; //for example
и значения Python будут обновлены немедленно, теперь проблема заключается в следующем:
как расширить или удалить некоторые значения (например, изменить список непосредственно из C ++)
как я чувствую, эти данные std::vector
как сделать push_back
и так далее, чтобы скорректировать размер быстрым способом (поскольку итерации в Python в значительной степени МЕДЛЕННЫ)
Учитывая только этот указатель, вы не можете расширить список. То, что вы переходите на 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 ...
}
}
Других решений пока нет …