c++与Python函数通信
C++ to communicate to Python function
我是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);
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 使用 Boost 的 UDP 通信(用于 MATLAB s 函数)
- C++无法在单独函数中的变量之间建立通信
- c++与Python函数通信
- 我需要在VC++中使用哪些函数进行串行通信