def run_command(self, command, script_name, progress_update, check_output=None): """ Runs a script. Must provide script_name (e.g. "script.py") and progress_update (e.g. "BINARIZING DATABASE"). Optionally can provide list of output files whose existences are checked to make sure command was successfully ran. We ALWAYS cd into the MODELLER's directory before running a script, and we ALWAYS cd back into the original directory after running a script. """ # first things first, we CD into MODELLER's directory os.chdir(self.directory) # run the command self.progress.update(progress_update) # try and execute the command process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = process.communicate() # if MODELLER script gave a traceback, it is caught here and everything is stopped if process.returncode: self.progress.end() error = error.decode('utf-8').strip() error = "\n" + "\n".join(error.split('\n')) print(terminal.c(error, color='red')) self.out["structure_exists"] = False raise ModellerScriptError("The MODELLER script {} did not execute properly. Hopefully it is clear \ from the above error message. No structure is going to be modelled."\ .format(script_name)) # If we made it this far, the MODELLER script ran to completion. Now check outputs exist if check_output: for output in check_output: utils.filesnpaths.is_file_exists(output) # MODELLER outputs a log that we rename right here, right now old_log_name = os.path.splitext(script_name)[0] + ".log" new_log_name = "gene_{}_{}".format(self.corresponding_gene_call, old_log_name) os.rename(old_log_name, new_log_name) # add to logs self.logs[script_name] = new_log_name self.run.info("Log of {}".format(script_name), new_log_name, progress=self.progress) # last things last, we CD back into the starting directory os.chdir(self.start_dir)
def run_command(self, command, script_name, check_output=None, rename_log=True): """Base routine for running MODELLER scripts Parameters ========== command : list of strs E.g. ['mod921', 'test_script.py', 'input1', 'input2'] corresponds to the command line "mod9.21 test_script.py input1 input2" script_name : str E.g. 'test_script.py' check_output : list, None Verify that this list of filepaths exist after the command is ran rename_log : bool, True MODELLER outputs a log that is renamed to reflect the command and gene used """ # first things first, we CD into MODELLER's directory os.chdir(self.directory) # try and execute the command process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = process.communicate() # if MODELLER script gave a traceback, it is caught here and everything is stopped if process.returncode: error = error.decode('utf-8').strip() error = "\n" + "\n".join(error.split('\n')) print(terminal.c(error, color='red')) self.out["structure_exists"] = False raise ModellerScriptError("The MODELLER script {} did not execute properly. Hopefully it is clear " "from the above error message. No structure is going to be modelled."\ .format(script_name)) # If we made it this far, the MODELLER script ran to completion. Now check outputs exist if check_output: for output in check_output: utils.filesnpaths.is_file_exists(output) # MODELLER outputs a log that we rename right here, right now old_log_name = os.path.splitext(script_name)[0] + ".log" if rename_log: new_log_name = "gene_{}_{}".format(self.corresponding_gene_call, old_log_name) os.rename(old_log_name, new_log_name) else: new_log_name = old_log_name # add to logs self.logs[script_name] = new_log_name self.run.info("Log of {}".format(script_name), new_log_name) # last things last, we CD back into the starting directory os.chdir(self.start_dir)