def job_info(job: Job): """ Prints information about given job to stdout :param job(Job): """ from sisyphus import tools print("Job id: %s" % job._sis_id()) print("Arguments:") for k, v in job._sis_kwargs.items(): print(" %s : %s" % (k, str(v))) print("Inputs:") for name, value in job.__dict__.items(): if not name.startswith('_sis_'): paths = tools.extract_paths(value) for path in paths: if path.creator is not job: if path.creator is None: print(" %s : %s" % (name, path.path)) else: print(" %s : %s %s" % (name, path.creator._sis_id(), path.path)) print("Outputs:") for name, value in job.__dict__.items(): if not name.startswith('_sis_'): paths = tools.extract_paths(value) for path in paths: if path.creator is job: print(" %s : %s" % (name, path.path)) print("Job dir: %s" % os.path.abspath(job._sis_path())) print("Work dir: %s" % job._sis_path(gs.WORK_DIR))
def submit_next_task(job: Job, setup_directory=True): if not job._sis_runnable(): logging.warning('Job is not runnable') return if setup_directory: job._sis_setup_directory() cached_engine().start_engine() task = job._sis_next_task() if task is None: logging.warning('No task to run') else: cached_engine().submit(task)
def run_job(job: Job, task_name: str = None, task_id: int = 1, force_resume: bool = False): """ Run job directly in console window. :param Job job: Job with tasks to run :param str task_name: which task should run, default: The first listed task :param int task_id: which task_id should be used, default: 1 :param bool force_resume: Force resume of job in error state """ assert isinstance(job, Job), "%s is not a Job" % job if not job._sis_setup(): logging.info('Job directory missing, set it up: %s' % job) setup_job_directory(job) task = None if task_name is None: task = job._sis_tasks()[0] else: for t in job._sis_tasks(): if t._start == task_name: task = t break assert task is not None, \ "'%s' is not a valid task name (Valid names: %s)" % (task_name, [t._start for t in job._sis_tasks()]) try: call = task.get_worker_call(task_id) if force_resume: call.append('--force_resume') import subprocess process = subprocess.Popen(call) try: process.wait() except KeyboardInterrupt as e: process.terminate() process.wait() raise e except Exception as e: import traceback logging.error("Job failed %s" % e) traceback.print_exc()
def setup_job_directory(job: Job): """ Setup the work directory of the given job. :param Job|Path job: Job which needs work directory """ original_input = job if is_path(job): job = job.creator from sisyphus.job import Job if isinstance(job, Job): if job._sis_runnable(): job._sis_setup_directory() logging.info('Done setting up: %s' % job) else: missing_inputs = '\n'.join( str(i) for i in job._sis_inputs if not i.available()) logging.error('Job has still missing inputs: %s' % missing_inputs) else: logging.error('Not a job: %s' % original_input) print(type(job))