def __init__(self, program_list):
uninstalled_programs = []<EOL>for program in program_list:<EOL><INDENT>if program in ExternalProgramSuite.programs_to_possibilities:<EOL><INDENT>check = [p for p in ExternalProgramSuite.programs_to_possibilities[program]<EOL>if extern.which(p)]<EOL>if len(check)><NUM_LIT:1>:<EOL><INDENT>logging.warning("<STR_LIT>" % ('<STR_LIT:U+0020>'.join(program_list), check[<NUM_LIT:0>]))<EOL><DEDENT>for key, item in ExternalProgramSuite.programs_to_possibilities.iteritems():<EOL><INDENT>if program in item:<EOL><INDENT>program = key<EOL><DEDENT><DEDENT>if len(check) > <NUM_LIT:0>:<EOL><INDENT>if key == self._FASTTREE:<EOL><INDENT>self.fasttree = check[<NUM_LIT:0>]<EOL><DEDENT><DEDENT>else:<EOL><INDENT>uninstalled_programs.append(program)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>if not extern.which(program):<EOL><INDENT>uninstalled_programs.append(program)<EOL><DEDENT><DEDENT><DEDENT>if any(uninstalled_programs):<EOL><INDENT>msg = "<STR_LIT>"<EOL>logging.error(msg)<EOL>for program in sorted(uninstalled_programs):<EOL><INDENT>try:<EOL><INDENT>package_name = ExternalProgramSuite.programs_to_packages[program]<EOL>print_name = '<STR_LIT:/>'.join((program, package_name))<EOL><DEDENT>except KeyError:<EOL><INDENT>package_name = program<EOL>print_name = program<EOL><DEDENT>logging.error('<STR_LIT>' % (print_name, ExternalProgramSuite.package_urls[package_name]))<EOL><DEDENT>exit(<NUM_LIT:1>)<EOL><DEDENT>
Given a list of executable names, check that they are available
        on the PATH, raising an exception otherwise

        Parameters
        ----------
        program_list: iterable of str
            list of program names to check