def get_options_from_file(self, options):
        """
        Search and read a configuration file to override options.
        Available formats are python, yaml and json (file extension rules).
        By default, there is no configuration file and this method exits immediately.
        To define a configuration file, use:
        - variable OPTIONS_FILE,
        - optional special parameter --options_file
        search order is:
        - hardcoded if file is an absolute path,
        - hardcoded path in variable OPTIONS_PATH if existing,
        - local directory,
        - ~/.clingon/,
        - /etc/clingon/,
        If a configuration file is found, sets the variable
        options_file_path to effective_path/effective_file.
        """
        options_file = self.python_options.get('options_file') or self._variables.get('OPTIONS_FILE')
        if not options_file:
            self._variables['options_file_path'] = None
            return
        options_path = self._variables.get('OPTIONS_PATH')
        options_dict, options_file_path = None, None
        try:
            if options_path or os.path.isabs(options_file):
                options_file_path, options_dict = read_configuration(options_file, options_path)
            else:
                for path in (os.getcwd(), os.path.expanduser('~/.clingon'), '/etc/clingon/'):
                    try:
                        options_file_path, options_dict = read_configuration(options_file, path)
                        break
                    except RuntimeError as e:
                        error = e
        except (RuntimeError, TypeError) as e:
            self._write_error(str(e))
        self._variables['options_file_path'] = options_file_path
        if options_dict:
            for k in list(self.python_options):
                default = options_dict.get(k)
                if default is not None:
                    options[k] = self.eval_option_value(default)
        else:
            self._write_error(str(error))