Source code for icolos.utils.execute_external.turbomole

import os
import shutil
import tempfile

from icolos.utils.enums.program_parameters import TurbomoleEnum
from icolos.utils.execute_external.execute import ExecutorBase

EE = TurbomoleEnum()


[docs]class TurbomoleExecutor(ExecutorBase): """For the execution of the "turbomole" binary.""" def __init__(self, prefix_execution=None, binary_location=None): super().__init__( prefix_execution=prefix_execution, binary_location=binary_location )
[docs] def execute( self, command: str, arguments: list, check=True, location=None, pipe_input=None ): # check, whether a proper executable is provided if command not in [ EE.TM_COSMOPREP, EE.TM_DEFINE, EE.TM_RIDFT, EE.TM_X2T, EE.TM_T2X, EE.CT_COSMOTHERM, EE.TM_JOBEX, ]: raise ValueError( "Parameter command must be an dictionary of the internal Turbomole executable list." ) # TM accesses a folder specified in $TURBOTMPDIR to deposit the particular temporary files for a run; this is # system-wide, so parallel runs will interfere; also it is not removed automatically # TODO: find a more elegant solution; is this really necessary for all binaries or only "ridft" and "jobex"? tmp_dir = tempfile.mkdtemp() command = "".join(["export TURBOTMPDIR=", tmp_dir, " && ", command]) result = super().execute( command=command, arguments=arguments, check=check, location=location, pipe_input=pipe_input, ) if tmp_dir is not None and os.path.isdir(tmp_dir): shutil.rmtree(tmp_dir) return result
[docs] def is_available(self): try: result = self.execute(command=EE.TM_RIDFT, arguments=[], check=True) if EE.TM_RIDFT_FAIL_IDENTIFICATION_STRING in result.stderr: return True return False except Exception as e: return False