/ / zmodyfikuj listę pythonów z C ++ - c ++, python, ctypes

zmodyfikuj listę pythonów z C ++ - c ++, python, ctypes

Mam listę Pythona, którą mogę uzyskać jego wskaźnik i przekazać ten adres wskaźnika do C ++, aby pracować

MyPointer = TheList.as_pointer()

teraz przekazuję ten adres do C ++ z ctypes

w C ++ mogę wykonać następujące czynności:

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

a wartości Pythona zostaną zaktualizowane natychmiast, teraz problem jest następujący: jak przedłużyć lub usunąć niektóre wartości (np. modyfikować listę bezpośrednio z C ++) jak czuję te dane są std::vector jak zrobić push_back i tak dalej, aby dostosować rozmiar w szybki sposób (ponieważ iteracja w Pythonie jest prawie ZWOLNIONA)

Odpowiedzi:

5 dla odpowiedzi № 1

Biorąc pod uwagę tylko ten wskaźnik, nie można rozszerzyć listy. To, co przechodzisz do C ++, to adres szyk wewnętrznie używane do implementacji listy Pythona. To nie może być std::vector, ponieważ listy Pythona nie są implementowane jako wektory STL, ale jako tablice poziomu C odwołań do obiektów Pythona. Te tablice nie zawierają backpointeru do obiektu listy Pythona.

Aby zmutować listę, spójrz na dokumentacja i połącz swój kod C ++ z biblioteką Pythona. Jeśli naprawdę musisz wywołać funkcję C ++ z ctypes, wywołaj ją przy pomocy id listy listy, aby uzyskać wskaźnik do listy, w przeciwieństwie do jej tablicy elementów. Następnie możesz operować na liście w następujący sposób:

#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 ...
}
}