Boost.Python和Python异常

4

我该如何使boost.python代码支持Python异常?

例如:

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

如果我将其导出到Python中,它不会在Ctrl-C上中断。我认为其他异常也不会以这种方式工作。

这只是一个玩具示例。我的真正问题是,我有一个C函数可能需要几个小时才能计算出来。如果它花费了超过一小时的时间,我想要中断它。但我不想杀死调用该函数的Python实例。

提前感谢您的帮助。


1
我对这个问题的答案很感兴趣。如果有的话,一个简单完整的工作示例将会非常有帮助。 - Faheem Mitha
2个回答

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

1
在Boost.Python中正确的做法不是直接使用C API,而是安装一个异常转换器:register_exception_translator<RuntimeException>(my_runtime_exception_translator);void my_runtime_exception_translator(RuntimeException const& ex) { PyErr_SetString(PyExc_RuntimeError, ex.toString().c_str()); } - Max Maximus
异常转换器将C++异常转换为Python异常。我认为这里的海报想要相反的:将KeyboardInterrupt Python异常暴露给C ++。 - Wichert Akkerman
1
我也对这个答案很感兴趣。提供一个最小工作示例会非常有帮助。 - Faheem Mitha

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接