utils.py 1.2 KB

1234567891011121314151617181920212223242526272829303132
  1. import glob
  2. import os
  3. from typing import List
  4. import matplotlib.pyplot as plt
  5. class SavefigRedirect:
  6. """Контекст, который перенаправляет plt.savefig('data/...') в нужную папку."""
  7. def __init__(self, base_dir: str):
  8. self.base_dir = base_dir
  9. self._orig = None
  10. def __enter__(self):
  11. self._orig = plt.savefig
  12. def _patched(fname, *args, **kwargs):
  13. if isinstance(fname, str) and (fname.startswith("data\\") or fname.startswith("data/")):
  14. out = os.path.join(self.base_dir, fname.replace("data\\", "data/").replace("data/", "data/"))
  15. os.makedirs(os.path.dirname(out), exist_ok=True)
  16. return self._orig(out, *args, **kwargs)
  17. return self._orig(fname, *args, **kwargs)
  18. plt.savefig = _patched
  19. return self
  20. def __exit__(self, exc_type, exc, tb):
  21. if self._orig:
  22. plt.savefig = self._orig
  23. def collect_outputs(work_dir: str) -> List[str]:
  24. candidates = []
  25. candidates += glob.glob(os.path.join(work_dir, "data", "**", "*.*"), recursive=True)
  26. candidates += glob.glob(os.path.join(work_dir, "*.png"))
  27. out = [p for p in sorted(set(candidates)) if os.path.isfile(p)]
  28. return out