【问题标题】:Python-C API: Trouble packing C strings into a tuplePython-C API:无法将 C 字符串打包成元组
【发布时间】:2012-11-02 03:56:19
【问题描述】:

在下面的代码中,我试图将两个以 null 结尾的 C 字符串(字符指针)打包到一个 Python 元组中。

printf("word1 = '%s', word2 = '%s'\n", words1->wordArray[i], words2->wordArray[i]);
cmpArgs = Py_BuildValue("ss", words1->wordArray[i], words2->wordArray[i]);
printf("%s\n", PyString_AsString(PyTuple_GetItem(cmpArgs, 0)));

这会产生如下输出:

word1 = '20', word2 = '20'
i┴

为什么元组中的字符串与外部的字符串不同?我究竟做错了什么?另外,我需要担心增加和减少这个元组的引用计数吗? (我正在创建它以传递给作为 PyObject* 传递给 C 的 Python 函数)

【问题讨论】:

  • 您的代码看起来正确。你#include <Python.h>了吗?您是否在打开所有警告的情况下进行编译(-Wall 使用 gcc)?有时忘记#include 会导致生成的代码错误地将指针参数传递给可变参数函数,例如Py_BuildValue。打开警告有助于捕捉这种错误(以及许多其他错误)。
  • 另外,将Py_BuildValue(...) 替换为cmpArgs = PyTuple_New(2); PyTuple_SetItem(cmpArgs, 0, PyString_FromString(words1->wordArray[i]); PyTuple_SetItem(cmpArgs, 1, PyString_FromString(words2->wordArray[i]); 是否有帮助?如果这有帮助,则表明 Py_BuildValue 被破坏了,可能是由于标题丢失或损坏。
  • 除了 之外我还需要哪些头文件? (我包括在内)尝试你的代码会严重地弄乱字符串并导致它进入无限循环。我是否会错误地计算参考文献?

标签: python c python-c-api


【解决方案1】:

我想我明白了——我以前使用堆栈空间以一种奇怪的方式存储单词。我开始在堆上为他们手动分配空间,这似乎已经解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多