"""macmodulefinder - Find modules used in a script. Only slightly mac-specific, really.""" import sys import os import directives try: # This will work if we are frozen ourselves import modulefinder except ImportError: # And this will work otherwise _FREEZEDIR=os.path.join(sys.prefix, ':Tools:freeze') sys.path.insert(0, _FREEZEDIR) import modulefinder # # Modules that must be included, and modules that need not be included # (but are if they are found) # MAC_INCLUDE_MODULES=['site', 'exceptions'] MAC_MAYMISS_MODULES=['posix', 'os2', 'nt', 'ntpath', 'dos', 'dospath', 'win32api', 'nturl2path', 'pwd', 'sitecustomize', 'org.python.core'] # An exception: Missing="macmodulefinder.Missing" class Module(modulefinder.Module): def gettype(self): """Return type of module""" if self.__path__: return 'package' if self.__code__: return 'module' if self.__file__: return 'dynamic' return 'builtin' class ModuleFinder(modulefinder.ModuleFinder): def add_module(self, fqname): if self.modules.has_key(fqname): return self.modules[fqname] self.modules[fqname] = m = Module(fqname) return m def process(program, modules=[], module_files = [], debug=0): error = [] # # Add the standard modules needed for startup # modules = modules + MAC_INCLUDE_MODULES # # search the main source for directives # extra_modules, exclude_modules, optional_modules, extra_path = \ directives.findfreezedirectives(program) for m in extra_modules: if os.sep in m: # It is a file module_files.append(m) else: modules.append(m) # collect all modules of the program path = sys.path[:] dir = os.path.dirname(program) path[0] = dir # "current dir" path = extra_path + path # # Create the module finder and let it do its work # modfinder = ModuleFinder(path, excludes=exclude_modules, debug=debug) for m in modules: modfinder.import_hook(m) for m in module_files: modfinder.load_file(m) modfinder.run_script(program) module_dict = modfinder.modules # # Tell the user about missing modules # maymiss = exclude_modules + optional_modules + MAC_MAYMISS_MODULES for m in modfinder.badmodules.keys(): if not m in maymiss: if debug > 0: print 'Missing', m error.append(m) # # Warn the user about unused builtins # for m in sys.builtin_module_names: if m in ('__main__', '__builtin__'): pass elif not module_dict.has_key(m): if debug > 0: print 'Unused', m elif module_dict[m].gettype() != 'builtin': # XXXX Can this happen? if debug > 0: print 'Conflict', m if error: raise Missing, error return module_dict