这是可以正常工作的东西
警告.pyx:
import warnings
cdef extern from "Python.h":
char* __FILE__
cdef extern from "Python.h":
int __LINE__
def dowarn():
warnings.warn_explicit("a warning", category=UserWarning, filename=__FILE__, lineno=__LINE__)
设置.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Compiler.Main import default_options
default_options['emit_linenums'] = True
from Cython.Distutils import build_ext
ext_modules = [ Extension("warn", ["warn.pyx"]) ]
setup(
name = "warn",
cmdclass = {"build_ext": build_ext},
ext_modules = ext_modules
)
诀窍是在生成 C 代码时让 cython 发出#line
指令,并诱使它认为__FILE__
和__LINE__
是它可以使用的真实变量。然后warnings中的warn_explicit函数可以用来覆盖确定源文件和行号的默认方法。