4

如何让 boost.python 代码知道 python 异常?

例如,

int test_for(){
  for(;;){
  }
  return 0;
}

如果我将它导出到 python,它不会在 Ctrl-C 上中断。我认为其他例外不会以这种方式起作用。

这是一个玩具示例。我真正的问题是我有一个可能需要数小时才能计算的 C 函数。我想打断它,例如,如果它需要更多的时间。但我不想杀死python实例,在函数内被调用。

提前致谢。

4

2 回答 2

2

在您的 C 或 C++ 代码中,为 SIGINT 安装一个设置全局标志的信号处理程序,并让您的长时间运行的函数定期检查该标志并在设置标志时提前返回。或者,您可以使用 Python C API 引发 Python 异常,而不是提前返回:请参阅此处的 PyErr_SetInterrupt 。

于 2009-06-17T17:18:09.460 回答
2

我不确定 boost.python 是否有解决方案 - 您可能必须自己处理这个问题。在这种情况下,它与传统的信号处理没有什么不同。简单的解决方案是拥有一个由信号处理程序更改的全局变量,并定期检查该变量。另一种解决方案是使用 setjmp/longjmp,但我认为第一种方法在适用时是最好的,因为它简单且更易于维护。

请注意,这是特定于 unix 的 - 我不知道这在 Windows 上是如何工作的。

于 2009-06-17T18:02:21.297 回答