cython/python:如何捕获一个“退出”而不是“返回”的外部函数异常

2 投票
1 回答
876 浏览
提问于 2025-04-18 15:44

我正在使用Cython来调用一个外部的C函数。这个函数是一个科学计算代码,代码量有10万行。它内部会检查一些不合法的情况,如果发现了这些情况,就会“退出”。

我想知道怎么才能让Cython在这个外部函数“退出”时能检测到并抛出一个异常,而不是简单地“返回”。

编辑:用户user2864740说得对,Cython确实会直接退出。(我之前是在一个Python的多进程环境中运行这个函数。为了简化问题,我去掉了多进程的部分。)现在的问题是:

我该如何阻止外部库中的“exit()”调用让Cython(或者将来让Python)直接退出。用try-except结构是无法捕捉到这个的。有没有办法把这个当作异常来处理,而不是让整个程序都崩溃?

谢谢!

1 个回答

1

multiprocessing 的文档中,有关于“处理僵尸进程”的一些指导原则。你可以在这里查看:https://docs.python.org/3/library/multiprocessing.html#programming-guidelines

如果你在主进程中发现工作进程已经变成了无效状态(也就是僵尸进程),你可以抛出一个异常来处理这个问题。

另外,你也可以尝试在 Cython 代码中注册一个 atexit 处理器,这样在程序结束时可以执行一些清理工作。具体可以参考这个链接:http://linux.die.net/man/3/atexit

还有一个方法是使用某种 LD_PRELOAD 库,来覆盖 exit 函数,这样在程序退出时就会抛出一个 Python 异常。

撰写回答