def run_wrapper(run, input, output, params, wildcards, threads, resources, log, linemaps): """ Wrapper around the run method that handles directory creation and output file deletion on error. Arguments run -- the run method input -- list of input files output -- list of output files wildcards -- so far processed wildcards threads -- usable threads log -- path to log file """ if log is None: log = Unformattable(errormsg="log used but undefined") try: # execute the actual run method. run(input, output, params, wildcards, threads, resources, log) except (Exception, BaseException) as ex: # this ensures that exception can be re-raised in the parent thread lineno, file = get_exception_origin(ex, linemaps) raise RuleException(format_error( ex, lineno, linemaps=linemaps, snakefile=file, show_traceback=True))
def run_wrapper(run, input, output, params, wildcards, threads, resources, log, version, benchmark, benchmark_repeats, rule, conda_env, linemaps, debug=False, shadow_dir=None): """ Wrapper around the run method that handles exceptions and benchmarking. Arguments run -- the run method input -- list of input files output -- list of output files wildcards -- so far processed wildcards threads -- usable threads log -- list of log files rule (str) -- rule name shadow_dir -- optional shadow directory root """ if os.name == "posix" and debug: sys.stdin = open('/dev/stdin') try: runs = 1 if benchmark is None else benchmark_repeats wallclock = [] for i in range(runs): w = time.time() # execute the actual run method. with change_working_directory(shadow_dir): run(input, output, params, wildcards, threads, resources, log, version, rule, conda_env) w = time.time() - w wallclock.append(w) except (KeyboardInterrupt, SystemExit) as e: # re-raise the keyboard interrupt in order to record an error in the scheduler but ignore it raise e except (Exception, BaseException) as ex: log_verbose_traceback(ex) # this ensures that exception can be re-raised in the parent thread lineno, file = get_exception_origin(ex, linemaps) raise RuleException(format_error(ex, lineno, linemaps=linemaps, snakefile=file, show_traceback=True)) if benchmark is not None: try: with open(benchmark, "w") as f: print("s", "h:m:s", sep="\t", file=f) for t in wallclock: print(t, str(datetime.timedelta(seconds=t)), sep="\t", file=f) except (Exception, BaseException) as ex: raise WorkflowError(ex)
def run_wrapper(run, input, output, params, wildcards, threads, resources, log, version, benchmark, benchmark_repeats, linemaps, debug=False, shadow_dir=None): """ Wrapper around the run method that handles exceptions and benchmarking. Arguments run -- the run method input -- list of input files output -- list of output files wildcards -- so far processed wildcards threads -- usable threads log -- list of log files shadow_dir -- optional shadow directory root """ if os.name == "posix" and debug: sys.stdin = open('/dev/stdin') try: runs = 1 if benchmark is None else benchmark_repeats wallclock = [] for i in range(runs): w = time.time() # execute the actual run method. with change_working_directory(shadow_dir): run(input, output, params, wildcards, threads, resources, log, version) w = time.time() - w wallclock.append(w) except (KeyboardInterrupt, SystemExit) as e: # re-raise the keyboard interrupt in order to record an error in the scheduler but ignore it raise e except (Exception, BaseException) as ex: log_verbose_traceback(ex) # this ensures that exception can be re-raised in the parent thread lineno, file = get_exception_origin(ex, linemaps) raise RuleException(format_error(ex, lineno, linemaps=linemaps, snakefile=file, show_traceback=True)) if benchmark is not None: try: with open(benchmark, "w") as f: print("s", "h:m:s", sep="\t", file=f) for t in wallclock: print(t, str(datetime.timedelta(seconds=t)), sep="\t", file=f) except (Exception, BaseException) as ex: raise WorkflowError(ex)