从c++修改python列表

modify a python list from C++

本文关键字:列表 python 修改 c++      更新时间:2023-10-16

我得到了一个Python列表,我可以获得它的指针,并将这个指针地址传递给c++来处理

MyPointer = TheList.as_pointer()

现在我用ctypes

将这个地址传递给c++在c++中

我可以做以下事情:

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

和Python值将立即更新,现在的问题是:如何扩展或删除一些值(比如直接从c++修改列表)因为我感觉这些数据是std::vector如何做push_back等等以快速方式调整大小(因为在Python中迭代非常慢)

如果只给出该指针,则无法扩展列表。你传递给c++的是内部用于实现Python列表的数组的地址。这不能是std::vector,因为Python列表不是作为STL向量实现的,而是作为Python对象引用的c级数组实现的。这些数组不包含指向Python列表对象的反向指针。

要改变列表,请查看文档并将c++代码与Python库链接起来。如果您确实必须从ctypes调用c++函数,请使用列表的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 ...
    }
}