【问题标题】:How to pass two python dictionaries to C++ function received by map如何将两个python字典传递给map接收的C++函数
【发布时间】:2011-06-19 19:35:54
【问题描述】:

我想在 Python 中调用一个 C++ 函数,该函数将两个 Python 字典(其键值为列表)作为参数,例如:

a = {'str1': [1, 2, 3], 'str2': [4, 5, 6]}
b = {'str3': [7, 8, 9], 'str4': [10, 11, 12]}
cppFunction(a, b)

在 C++ 中,被调用的函数获取两个字典并将它们存储在两个 map<string, vector<int>> 类型的变量中。我怎样才能做到这一点?我必须使用boost库吗?

谢谢,

青坤

【问题讨论】:

  • 你打算如何包装你的 C++ 函数?促进?痛饮?士博肯? ..或自己编写包装器? .. 在回答这个问题之前,我们需要知道这一点。如果您还不知道,请说明您在询问哪种包装方法/库最适合您的情况/最简单。
  • @Ignacio Vazquez-Abrams @Macke 我正在尝试在我的 C++ 函数中使用由字符串索引的列表,就像做一些计算一样。我不知道哪种方式在运行速度方面最有效。因为我对这些有点陌生,如果您能介绍一种简单有效的方法,我将不胜感激。谢谢

标签: c++ python


【解决方案1】:

据我了解,您的问题有两个部分:1. 如何从 python 调用 C++ 函数?2. 在 C++ 中应该使用哪些数据结构来保存计算的输入?

1. 的答案说来话长。例如,参见this questionthis question。对于 2.,对于给定的示例,我会使用 map<string, vector<int>>,正如您所建议的那样,在包装类中,或者使用 multimap<string, int>,因为它的现有接口可能更容易使用,所以使用起来会更快。

更新:添加了 1 的另一个答案的链接。

【讨论】:

  • 感谢您的回答。实际上,我知道如何从 python 调用 C++ 函数,但我只知道以值或单个变量作为参数,通过在 C++ 函数中调用 PyArg_ParseTuple() 来获取参数。但是,现在我希望将列表作为键值的字典作为传递参数。我怎样才能做到这一点?如果你能给我一些示例代码会更好。
【解决方案2】:

如果您想将 Python 参数传递给没有直接 C/C++ 等效项(即不是字符串或数字)的 C/C++ 函数,最好的办法是将指向它们的指针作为通用 Python 对象并这样对待他们。

这意味着您的 C++ 扩展代码必须像 Python 解释器一样以通用术语处理它们,这需要执行诸如查找它们的方法并调用它们进行操作之类的事情——如检索、设置或删除—— - 它们的内容,如果它们是容器对象,例如listsdicts 等。然后,您的扩展程序可以使用此信息来构建您想要的特定 C++ map<> 模板类型。

开源PyCXX 项目提供了使编写 C++ Python 扩展更容易的工具,并提供了用于处理 DictList 参数的预编写 C++ 类。更好的是,您可以将它们视为抽象的 SequenceMapping 对象,这将使您的扩展代码能够处理实现相同接口的其他 Python 类型。

【讨论】:

    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2016-01-30
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多