我有一个python对象,它通过HTTP访问和下载一些文本。 我正在运行这个python对象,并使用c ++代码处理该文本。 即。
/* 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
大多数网址都运行良好--- 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)创建。它不能被解除分配。“ “
答案 0 :(得分:1)
PyString_AsString
文档说:“指针指的是字符串的内部缓冲区,而不是副本。除非字符串刚刚使用PyString_FromStringAndSize(NULL,size)创建,否则不得以任何方式修改数据。 一定不能解除分配。“
请确保您不释放此缓冲区
答案 1 :(得分:0)
如果使用-g debug标志编译C代码(至少在GCC中),则可以使用gnu调试器gdb运行python代码:
$ gdb /path/to/python/compiled/against
... blah ...
(gdb) run PyObject.py
你应该抓住你的段错误。
答案 2 :(得分:0)
我的猜测是Py_DECREF以某种方式得到一个NULL值。