-1

我有一个 python 对象,它通过 HTTP 访问和下载一些文本。我正在运行这个 python 对象,并使用 c++ 代码处理该文本。IE

/* CPPCode.cxx */
int main(...) {
    for(int i = 0; i < numURLs; i++) {
        // Python method returns a string
        PyObject *pyValue = PyObject_CallMethod(pyObjectInstance, pyFunctionName, par1, par2....);
        string valString = PyString_AsString(pHistValue);   
        // ... process string ... 
    }
} 

/* PyObject.py */
class PyClass:
    def PyFunction(...):
        try: urlSock = urllib.urlopen(urlName)
        except ...

        while(...) :
             dataStr = urlSock.readline()
             # do some basic string processing....

        return dataStr

大多数 URL 都可以正常工作——c++ 代码得到了正确的字符串,我可以处理它,一切都很好。一些在浏览器上看起来(基本上)与其他 URL 相同的特定 URL,会导致 PyString_AsString() 方法中的段错误:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000000000b2
0x000000010007716d in PyString_AsString ()

如果我打印出应该由python方法返回的字符串(上面伪代码中的'dataStr'),它看起来很好!我不知道是什么导致了这个问题——任何关于如何进行的提示都将不胜感激!谢谢

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解决方案:

我使用的模板代码调用了

Py_DECREF(pyValue)

在我打电话之前

PyString_AsString(pyValue)

为什么要为某些特定的函数调用释放它,我不知道。正如“Gecco”在下面的评论中所说,

'PyString_AsString 文档说:“指针指的是字符串的内部缓冲区,而不是副本。不得以任何方式修改数据,除非字符串刚刚使用 PyString_FromStringAndSize(NULL, size) 创建。不得释放。 " '

4

3 回答 3

1

PyString_AsString文档说:“指针指的是字符串的内部缓冲区,而不是副本。不得以任何方式修改数据,除非字符串是刚刚使用 PyString_FromStringAndSize(NULL, size) 创建的。不得释放。”

请确保您不释放此缓冲区

于 2012-01-05T22:53:52.837 回答
0

如果您使用 -g 调试标志(至少在 GCC 中)编译您的 C 代码,那么您可以使用 gnu 调试器 gdb 运行您的 python 代码:

$ gdb /path/to/python/compiled/against 
... blah ...
(gdb) run PyObject.py

你应该抓住你的段错误。

于 2012-01-05T21:32:33.783 回答
0

我的猜测是 Py_DECREF 以某种方式获得了 NULL 值。

于 2012-01-06T02:52:52.317 回答