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 № 1Biorą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 ...
}
}