【问题标题】:Boost.Python and Python exceptionsBoost.Python 和 Python 异常
【发布时间】:2009-06-17 16:59:54
【问题描述】:

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

例如,

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

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

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

提前致谢。

【问题讨论】:

  • 我对这个问题的答案很感兴趣。如果可以的话,一个简单而完整的工作示例将是最有帮助的。

标签: c++ boost-python


【解决方案1】:

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

【讨论】:

  • 在Boost.Python下正确的做法是不要直接使用C API,而是安装一个异常翻译器:register_exception_translator(my_runtime_exception_translator); void my_runtime_exception_translator(RuntimeException const& ex) { PyErr_SetString(PyExc_RuntimeError, ex.toString().c_str()); }
  • 异常翻译器将 C++ 异常转换为 Python 异常。我认为这里的海报想要相反:将 KeyboardInterrupt python 异常暴露给 C++。
  • 我也对这个答案感兴趣。一个最小的工作示例将是最有帮助的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多