Source code for earthdiagnostics.cdftools
# coding=utf-8
"""CDFTOOLS interface"""
import os
import six
from bscearth.utils.log import Log
from earthdiagnostics.utils import Utils
[docs]class CDFTools(object):
"""
Class to run CDFTools executables
:param path: path to CDFTOOLS binaries
:type path: str
"""
def __init__(self, path=''):
self.path = path
# noinspection PyShadowingBuiltins
[docs] def run(self, command, input_file, output_file=None, options=None, log_level=Log.INFO, input_option=None):
"""
Run one of the CDFTools
:param command: executable to run
:type command: str | iterable
:param input_file: input file
:type input_file: str
:param output_file: output file. Not all tools support this parameter
:type options: str
:param options: options for the tool.
:type options: str | [str] | Tuple[str] | None
:param log_level: log level at which the output of the cdftool command will be added
:type log_level: int
:param input_option: option to add before input file
:type input_option: str
"""
line = [os.path.join(self.path, command)]
self._check_command_existence(line[0])
if input_option:
line.append(input_option)
self._check_input(command, input_file, line)
if options:
if isinstance(options, six.string_types):
options = options.split()
for option in options:
line.append(str(option))
if output_file:
if input_file == output_file:
raise ValueError('Input and output file can not be the same on CDFTools')
line.append('-o')
line.append(output_file)
Log.debug('Executing {0}', ' '.join(line))
shell_output = Utils.execute_shell_command(line, log_level)
self._check_output_was_created(line, output_file)
return shell_output
@staticmethod
def _check_output_was_created(line, output):
if output:
if not os.path.isfile(output):
raise Exception('Error executing {0}\n Output file not created', ' '.join(line))
# noinspection PyShadowingBuiltins
@staticmethod
def _check_input(command, input_file, line):
if input_file:
if isinstance(input_file, six.string_types):
line.append(input_file)
if not os.path.isfile(input_file):
raise ValueError('Error executing {0}\n Input file {1} file does not exist', command, input_file)
else:
for element in input_file:
line.append(element)
if not os.path.isfile(element):
raise ValueError('Error executing {0}\n Input file {1} file does not exist', command, element)
@staticmethod
def _is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
def _check_command_existence(self, command):
if self.path:
if self._is_exe(os.path.join(self.path, command)):
return
else:
for path in os.environ["PATH"].split(os.pathsep):
path = path.strip('"')
exe_file = os.path.join(path, command)
if self._is_exe(exe_file):
return
raise ValueError('Error executing {0}\n Command does not exist in {1}'.format(command, self.path))