Boost.Python和Python异常

时间:2009-06-17 16:59:54

标签: c++ boost-python

如何识别boost.python代码python异常?

例如,

int test_for(){
  for(;;){
  }
  return 0;
}
如果我将它导出到python,

不会在Ctrl-C上中断。我认为其他例外情况 不会以这种方式工作。

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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