<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run_reduce(input_file, path=True):
 """ Runs reduce on a pdb or mmol file at the specified path. Notes ----- Runs Reduce programme to add missing protons to a PDB file. Parameters input_file : str Path to file to add protons to or structure in mmol/pdb format. path : bool, optional True if input_file is a path. Returns ------- reduce_mmol : str Structure file with protons added. reduce_message : str Messages generated while running Reduce. Raises ------ FileNotFoundError Raised if the executable cannot be found. """

    if path:
        input_path = Path(input_file)
        if not input_path.exists():
            print('No file found at', path)
            return None, None
    else:
        pathf = tempfile.NamedTemporaryFile()
        encoded_input = input_file.encode()
        pathf.write(encoded_input)
        pathf.seek(0)
        file_path = pathf.name
        input_path = Path(file_path)
    reduce_folder = Path(global_settings['reduce']['folder'])
    reduce_exe = reduce_folder / global_settings['reduce']['path']
    reduce_dict = reduce_folder / 'reduce_wwPDB_het_dict.txt'
    try:
        reduce_output = subprocess.run(
            [str(reduce_exe), '-build', '-DB',
             str(reduce_dict), str(input_path)],
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    except FileNotFoundError as e:
        raise FileNotFoundError(
            'The Reduce executable cannot be found. Ensure the '
            'location and filename are specified in settings.')
    try:
        reduced_mmol = reduce_output.stdout.decode()
    except UnicodeDecodeError:
        print("Reduce could not detect any missing protons in the protein. "
              "Using the original structure.")
        if path:
            reduced_mmol = input_path.read_text()
        else:
            reduced_mmol = input_file
    reduce_message = reduce_output.stderr.decode()
    if 'could not open' in reduce_message:
        print('Caution: the Reduce connectivity dictionary could not be '
              'found. Some protons may be missing. See notes.')
    return reduced_mmol, reduce_message