DebugWriter.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from __future__ import absolute_import
  2. import os
  3. import sys
  4. import errno
  5. try:
  6. from lxml import etree
  7. have_lxml = True
  8. except ImportError:
  9. have_lxml = False
  10. try:
  11. from xml.etree import cElementTree as etree
  12. except ImportError:
  13. try:
  14. from xml.etree import ElementTree as etree
  15. except ImportError:
  16. etree = None
  17. from ..Compiler import Errors
  18. class CythonDebugWriter(object):
  19. """
  20. Class to output debugging information for cygdb
  21. It writes debug information to cython_debug/cython_debug_info_<modulename>
  22. in the build directory.
  23. """
  24. def __init__(self, output_dir):
  25. if etree is None:
  26. raise Errors.NoElementTreeInstalledException()
  27. self.output_dir = os.path.join(output_dir or os.curdir, 'cython_debug')
  28. self.tb = etree.TreeBuilder()
  29. # set by Cython.Compiler.ParseTreeTransforms.DebugTransform
  30. self.module_name = None
  31. self.start('cython_debug', attrs=dict(version='1.0'))
  32. def start(self, name, attrs=None):
  33. self.tb.start(name, attrs or {})
  34. def end(self, name):
  35. self.tb.end(name)
  36. def serialize(self):
  37. self.tb.end('Module')
  38. self.tb.end('cython_debug')
  39. xml_root_element = self.tb.close()
  40. try:
  41. os.makedirs(self.output_dir)
  42. except OSError as e:
  43. if e.errno != errno.EEXIST:
  44. raise
  45. et = etree.ElementTree(xml_root_element)
  46. kw = {}
  47. if have_lxml:
  48. kw['pretty_print'] = True
  49. fn = "cython_debug_info_" + self.module_name
  50. et.write(os.path.join(self.output_dir, fn), encoding="UTF-8", **kw)
  51. interpreter_path = os.path.join(self.output_dir, 'interpreter')
  52. with open(interpreter_path, 'w') as f:
  53. f.write(sys.executable)