【问题标题】:Extracting nested python dictionaries in C在C中提取嵌套的python字典
【发布时间】:2016-09-15 15:43:56
【问题描述】:

如何访问从 Python(通过scipy.weave)传递到 C 的嵌套字典?

我正在开发一些复杂的代码,需要将 Python 代码与 C 代码连接。 python/scipy.weave代码向C接口传递一个嵌套字典,如:

nested_dict = {'key1': dict_1, 'key2': dict_2, ...}

dict_1,dict_2,... 本身就是字典,例如:

dict_1 = {'kd1': val1, ...}

假设我想在kd1dict_1 中访问val1scipy.weave 代码调用 C 函数 myfunc(PyObject* nested_dict) 其中:

void myfunc(PyObject* nested_dict){
    PyObject* dict1 = PyDict_GetItemString(nested_dict,"key1");
    double val1 = PyFloat_AS_DOUBLE(PyDict_GetItemString(dict1,"kd1"));
}

不幸的是,这在第二行不幸崩溃了。我不明白为什么。

任何帮助将不胜感激。

干杯, 毛里齐奥

【问题讨论】:

  • 你的错误检查在哪里?
  • 好点。我做了更多的错误检查。我传递了错误的数据结构。上面的代码是正确的。
  • 尽管如此,您应该在代码中添加一些错误检查(例如,如果任何返回值为NULL,则立即返回)。
  • 谢谢。我确实会这样做。

标签: python-2.7 dictionary nested python-c-api


【解决方案1】:

它崩溃了,因为我传递的嵌套字典没有键 key1。 Ignacio 在 cmets 中建议的简单错误检查,即

PyObject * dict_1 = PyDict_GetItemString(nested_dict,"key1");
if(dict_1==NULL){
    fprintf(stderr, "key1 is not a dictionary key\n");
    exit(-1);
}

帮助识别错误。否则上面写的代码就达到了目的。

【讨论】:

  • 请注意,exit(-1); 实际上不是您应该做的事情(您也不需要打印,但这是一个单独的问题);您应该在进行相关清理后return NULL;,以便将API设置的异常抛出给调用者。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 2021-02-12
  • 2016-05-15
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2021-05-10
相关资源
最近更新 更多