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