Вот то, что работает хорошо
warn.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__)
setup.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
)
Хитрость заключается в том, чтобы заставить генерировать директивы cython #line
при генерации кода C и заставить его думать, что __FILE__
и __LINE__
- реальные переменные, которые он может использовать. Затем можно использовать функцию warn_explicit из предупреждений, чтобы переопределить метод определения исходного файла и номера строки по умолчанию.