从 python 中的 C 库中捕获错误

Catch an error from a C library in python

提问人:rseppi 提问时间:7/4/2023 最后编辑:rseppi 更新时间:7/4/2023 访问量:39

问:

我正在将一些数据点拟合到 python 中的贝叶斯框架(类似 mcmc)中的模型。我正在使用 C 库来预测模型。对于某些参数集,C 库无法计算模型,因为它预测了一些非物理参数(举一个不相关的例子,就好像它预测质量<0 一样)。发生这种情况时,C 代码包含一个“exit()”。因此,参数空间的采样停止。我想忽略模型预测失败的特定参数组合,并继续进行采样。我尝试使用'try'-'except',但这不起作用,因为外部C代码仍然失败,并且python代码在移动到“expcept”之前停止。我无法修改 C 库。有没有办法在不停止python中的参数采样的情况下从C代码中捕获错误?

下面是一段类似的代码:

def my_likelihood(params):
    try:
    model = model_from_c_library(x_data, params)
    diff = model - y_data
    like = -0.5 * ((diff / err) ** 2).sum()
    if (np.isnan(like) | np.isinf(like) | np.isnan(model).any()):
         like = -1e30
    except:
        like = -1e30
    return like

就我而言,“model_from_c_library”返回错误并且 python 代码停止,因为在 model_from_c_library.c 中,有类似的东西:

double mass(pars):
    m = predict_mass(pars);
    if m < 0:
        exit(101);

我想在 Python 中将其作为例外。

Python C 异常 错误处理

评论

0赞 user2357112 7/4/2023
听起来像是子进程的工作,如果你真的不能修改 C。
0赞 rochard4u 7/4/2023
在 c++ 中但与 c 中的问题相同:如何从 python 代码中捕获嵌入式 C++ 模块中的 exit()?

答: 暂无答案