从C ++修改python列表

时间:2013-04-05 12:15:05

标签: c++ python ctypes

我有一个Python列表,我可以获取它的指针,并将此指针地址传递给C ++以便

MyPointer = TheList.as_pointer()

现在我使用ctypes

将此地址传递给C ++

在C ++中我可以执行以下操作:

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

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

1 个答案:

答案 0 :(得分:6)

仅指定该指针,您无法扩展列表。传递给C ++的是内部用于实现Python列表的数组的地址。这不能是std::vector,因为Python列表不是作为STL向量实现的,而是作为Python对象引用的C级数组实现的。这些数组不包含Python列表对象的backpointer。

要改变列表,请查看the documentation并将您的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 ...
    }
}