gpt4 book ai didi

python - C++ 与 Python 函数通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:08 24 4
gpt4 key购买 nike

我是c++新手,

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

能够通过将项目添加到同一解决方案并添加对 DLL 的引用来执行。

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

最佳答案

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

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

...if you receive an object from a Python program and you are not sure that it has the right type, you must perform a type check first; for example, to check that an object is a dictionary, use 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);

关于python - C++ 与 Python 函数通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39588385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com