def find_needed_modules(self, mf, files, modules):
        # feed Modulefinder with everything, and return it.
        for mod in modules:
            mf.import_hook(mod)

        for path in files:
            mf.run_script(path)

        mf.run_script(self.get_boot_script("common"))

        if self.distribution.com_server:
            mf.run_script(self.get_boot_script("com_servers"))

        if self.distribution.ctypes_com_server:
            mf.run_script(self.get_boot_script("ctypes_com_server"))

        if self.distribution.service:
            mf.run_script(self.get_boot_script("service"))

        if self.custom_boot_script:
            mf.run_script(self.custom_boot_script)

        for mod in self.includes:
            if mod[-2:] == '.*':
                mf.import_hook(mod[:-2], None, ['*'])
            else:
                mf.import_hook(mod)

        for f in self.packages:
            def visit(arg, dirname, names):
                if '__init__.py' in names:
                    arg.append(dirname)

            # Try to find the package using ModuleFinders's method to
            # allow for modulefinder.AddPackagePath interactions
            mf.import_hook(f)

            # If modulefinder has seen a reference to the package, then
            # we prefer to believe that (imp_find_module doesn't seem to locate
            # sub-packages)
            if f in mf.modules:
                module = mf.modules[f]
                if module.__path__ is None:
                    # it's a module, not a package, so paths contains just the
                    # file entry
                    paths = [module.__file__]
                else:
                    # it is a package because __path__ is available.  __path__
                    # is actually a list of paths that are searched to import
                    # sub-modules and sub-packages
                    paths = module.__path__
            else:
                # Find path of package
                try:
                    paths = [imp_find_module(f)[1]]
                except __HOLE__:
                    self.warn("No package named %s" % f)
                    continue

            packages = []
            for path in paths:
                # walk the path to find subdirs containing __init__.py files
                os.path.walk(path, visit, packages)

                # scan the results (directory of __init__.py files)
                # first trim the path (of the head package),
                # then convert directory name in package name,
                # finally push into modulefinder.
                for p in packages:
                    if p.startswith(path):
                        package = f + '.' + p[len(path)+1:].replace('\\', '.')
                        mf.import_hook(package, None, ["*"])

        return mf
dataset/ETHPy150Open fogleman/FeedNotifier/patch/build_exe.py/py2exe.find_needed_modules