c++与Python函数通信



我是c++新手,

我创建了包含类和函数的DLL,每个函数的返回类型都是PyObject (Python对象),所以现在我想写一个c++应用程序,它使用LoadLibrary函数动态加载DLL。

可以将项目添加到相同的解决方案中并将引用添加到DLL中。

我能够加载DLL,但是当我调用它返回PyObject数据类型的函数时,如何在c++中存储PyObject的返回类型?

你应该看看Python关于具体对象层的文档。基本上,您必须使用Py*T*_As*T*(PyObject* obj)形式的函数将PyObject转换为c++类型,其中T是您想要检索的具体类型。

API假定您知道应该调用哪个函数。但是,正如文档中所述,您可以在使用前检查类型:

…如果你从Python程序接收到一个对象,但你不确定它的类型是否正确,你必须首先执行类型检查;例如,检查对象是否为字典,使用PyDict_Check()

下面是一个将PyObject转换为long的示例:

PyObject* some_py_object = /* ... */;
long as_long(
    PyLong_AsLong(some_py_object)
);
Py_DECREF(some_py_object);

下面是另一个更复杂的示例,将Python list转换为std::vector:

PyObject* some_py_list = /* ... */;
// assuming the list contains long
std::vector<long> as_vector(PyList_Size(some_py_list));
for(size_t i = 0; i < as_vector.size(); ++i)
{
    PyObject* item = PyList_GetItem(some_py_list, i);
    as_vector[i] = PyLong_AsLong(item);
    Py_DECREF(item);
}
Py_DECREF(some_py_list);

最后一个更复杂的例子,将Python dict解析为std::map:

PyObject* some_py_dict = /* ... */;
// assuming the dict uses long as keys, and contains string as values
std::map<long, std::string> as_map;
// first get the keys
PyObject* keys = PyDict_Keys(some_py_dict);
size_t key_count = PyList_Size(keys);
// loop on the keys and get the values
for(size_t i = 0; i < key_count; ++i)
{
    PyObject* key = PyList_GetItem(keys, i);
    PyObject* item = PyDict_GetItem(some_py_dict, key);
    // add to the map
    as_map.emplace(PyLong_AsLong(key), PyString_AsString(item));
    Py_DECREF(key);
    Py_DECREF(item);
}
Py_DECREF(keys);
Py_DECREF(some_py_dict);

最新更新