Source code for schrodinger.job.files

import contextlib
import itertools

from schrodinger.utils import subprocess
from schrodinger.utils.fileutils import tempfilename


[docs]@contextlib.contextmanager def get_file(job, filename): """ Yields a filename that is readable for the lifetime of the context manager. :param job: schrodinger.jobcontrol.Job :type job: schrodinger.jobcontrol.Job :param str filename: a filename of an output or logfile for a given jobid :type filename: a filename of an output or logfile for a given jobid :raises RuntimeError: if the job has been downloaded already """ if filename not in itertools.chain(job.OutputFiles, job.LogFiles): raise RuntimeError( f"Specifying a file {filename} that is not an OutputFile or LogFile for {job}" ) with tempfilename() as output_filename: with open(output_filename, "w") as fh: proc = subprocess.run( ["jsc", "tail-file", job.JobId, "--name", filename], stdout=fh, stderr=subprocess.PIPE, universal_newlines=True) if proc.returncode != 0: raise RuntimeError( f"Could not get {filename} for {job}: {proc.stderr}") yield output_filename