utils.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import tempfile
  2. class WrapLogger():
  3. """
  4. Used to convert a Logger into file streams. Adds easy integration
  5. of Logger into subprocess, which takes file parameters for stdout
  6. and stderr.
  7. Use:
  8. (out, err) = WrapLogger(logger, logging.INFO), WrapLogger(logger, logging.ERROR)
  9. subprocess.Popen(command, stdout=out, stderr=err)
  10. """
  11. def __init__(self, logger, level):
  12. self.logger = logger
  13. self.level = level
  14. self.file = tempfile.TemporaryFile()
  15. def write(self, message):
  16. self.logger.log(self.level, message)
  17. def __getattr__(self, name):
  18. return getattr(self.file, name)
  19. def __del__(self):
  20. """Grabs any output that was written directly to the file (e.g. bypassing
  21. the write method). Subprocess.call, Popen, etc have a habit of accessing
  22. the file directly for faster writing. See http://bugs.python.org/issue1631
  23. """
  24. self.file.seek(0)
  25. for line in self.file.readlines():
  26. self.logger.log(self.level, line.rstrip('\n'))
  27. class Header():
  28. """
  29. """
  30. def __init__(self, message, top='-', bottom='-'):
  31. self.message = message
  32. self.top = top
  33. self.bottom = bottom
  34. def __str__(self):
  35. topheader = self.top * 80
  36. topheader = topheader[:80]
  37. bottomheader = self.bottom * 80
  38. bottomheader = bottomheader[:80]
  39. return "\n%s\n %s\n%s" % (topheader, self.message, bottomheader)