如何从swig C++;密码? 我试图通过在类上实现Python迭代协议来扩展C++库。问题是,试图从next()方法引发StopIteration异常会导致程序出现SegFault。用于从C++代码中(Python i)中引发异常的方法是这里描述的:

如何从swig C++;密码? 我试图通过在类上实现Python迭代协议来扩展C++库。问题是,试图从next()方法引发StopIteration异常会导致程序出现SegFault。用于从C++代码中(Python i)中引发异常的方法是这里描述的:,c++,python,swig,C++,Python,Swig,虽然该列表中没有列出StopIteration异常,但这是我尝试过的: PyErr_SetString(PyExc_StopIteration, NULL); segfault几乎肯定是由传递给PyErr\u SetString的空指针引起的。请尝试以下操作: PyErr_SetString(PyExc_StopIteration, "end of collection"); edit我刚刚看到了下面一篇精彩的文章,你可能会发现这篇文章很有用:所以正确的答案似乎是next()方法必须返回Py

虽然该列表中没有列出StopIteration异常,但这是我尝试过的:

PyErr_SetString(PyExc_StopIteration, NULL);

segfault几乎肯定是由传递给
PyErr\u SetString
的空指针引起的。请尝试以下操作:

PyErr_SetString(PyExc_StopIteration, "end of collection");

edit我刚刚看到了下面一篇精彩的文章,你可能会发现这篇文章很有用:

所以正确的答案似乎是next()方法必须返回PyObject*并使用SetNone。所以看起来是这样的:

PyObject* next(PyObject* self) {
  if (i < n) {
         \\ go on iterating
  } else {
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
  }
}
PyObject*next(PyObject*self){
if(i

感谢aix提供的链接

对。python解释器似乎不认为这是StopIteration异常。它不会退出循环,而是永远继续下去。我认为这可能根本不是提出错误的正确机制?代码似乎只是将该消息发送到stderr,但没有引发python异常…@mapleoin:如果您还没有看到,请看一看。