Cython技术问题咨询:异常定向至文件与模块内程序退出
解决Cython开发中的两个常见问题
1. 如何将异常输出到文件?
你用的命令顺序搞反啦!Shell里重定向的顺序是有讲究的,2>&1 > /tmp/hello.txt会先把stderr重定向到原来的stdout(也就是屏幕),再把stdout写到文件,所以stderr还是会打在屏幕上。正确的命令应该是:
python python_cython_example.py > /tmp/hello.txt 2>&1
这样先把stdout导向文件,再把stderr重定向到当前的stdout(也就是目标文件),所有输出就都能写入文件了。
如果你的异常是Cython里C层级抛出的(比如用PyErr_SetString设置的错误,或者C代码直接打印到stderr),这个命令也能覆盖到。要是还不行,也可以在Python代码开头手动重定向stderr:
import sys sys.stderr = open('/tmp/hello.txt', 'a')
这样不管是Python还是C层级的stderr输出都会写到文件里。
2. 如何在Cython模块内退出程序?
调试阶段确实会遇到sys.exit()无效的情况——因为sys.exit()本质是抛出一个SystemExit异常,如果你的Cython代码是在纯C的函数上下文里(比如没有被Python的try-except块包裹,或者直接在cdef/cpdef函数里调用,而这个函数是被C代码调用的),Python的异常机制可能无法触发程序退出,反而会被忽略。
这时候直接用C标准库的exit()函数就靠谱多了,在Cython里可以这么写:
cdef extern from "stdlib.h": void exit(int status) # 在需要退出的地方调用 exit(1) # 非0状态码表示异常退出
这个函数会直接终止整个进程,不管当前是在Python还是C的上下文里,调试时用来快速终止程序非常方便。
内容的提问来源于stack exchange,提问作者q0987
相关产品推荐
相关产品推荐

