Source code for exosim.output.setOutput

import os
import tempfile
from pathlib import Path

import h5py

import exosim.log as log

from .hdf5 import HDF5Output


[docs]class SetOutput(log.Logger): """ It sets the output for the code. This class created and initializes the output file. If a file name is provided, it loads the relative :class:`~exosim.output.output.Output` class is instatiated. Otherwise an :class:`~exosim.output.hdf5.hdf5.HDF5Output` is used by default for a temporary file. """ def __init__(self, filename: str = None, replace: bool = True): """ Parameters ---------- filename: str (optional) output file name for. If `None` a temporary file is produced. """ super().__init__() self.tmp = False if filename is None: path = Path(os.path.join(os.getcwd(), "tmp")) tempfile.tempdir = path tempfile.tempdir.mkdir(parents=True, exist_ok=True) filename = tempfile.NamedTemporaryFile( suffix=".h5", delete=False ).name self.tmp = True self.info("file name set: {}".format(filename)) dir_name = os.path.dirname(os.path.abspath(filename)) if not os.path.exists(dir_name): os.makedirs(dir_name) self.debug("created {}".format(dir_name)) self.fname = filename if replace: if os.path.exists(filename): os.remove(filename)
[docs] def use(self, append: bool = True, cache: bool = False) -> HDF5Output: """ It returns the :class:`~exosim.output.output.Output` with file opened and ready to write Parameters ---------- append: bool (optional) True to append data to already existing file. Default is True. cache: bool (optional) True to write data in caching mode. Default is False. Returns ------- :class:`~exosim.output.output.Output` output class instantiated. """ if self.fname.endswith(".h5"): return HDF5Output(self.fname, append, cache)
[docs] def open(self) -> h5py.File: """ It returns the :class:`~exosim.output.output.Output` with file opened and ready to read Returns ------- :class:`~exosim.output.output.Output` output class instantiated. """ if self.fname.endswith(".h5"): f = HDF5Output(self.fname, append=True) f.open() return f.fd
def __del__(self) -> None: """ Garbage collector: it deletes the file when not in use by the context. """ if self.tmp: self.delete()
[docs] def delete(self) -> None: """ It deletes the output file created. """ try: os.remove(self.fname) self.debug("file deleted: {}".format(self.fname)) except FileNotFoundError: pass # check if the file has been correctly removed if Path(self.fname).is_file(): self.warning("file not deleted: {}".format(self.fname)) # if temp dir is empty, delete it try: if not any(tempfile.tempdir.iterdir()): os.rmdir(tempfile.tempdir) self.debug( "temporary dir deleted: {}".format(tempfile.tempdir) ) except FileNotFoundError: pass except FileNotFoundError: pass except AttributeError: pass