"""Findmodulefiles - Find out where modules are loaded from. Run findmodulefiles() after running a program with "python -i". The resulting file list can be given to mkfrozenresources or to a (non-existent) freeze-like application. findmodulefiles will create a file listing all modules and where they have been imported from. findunusedbuiltins takes a list of (modules, file) and prints all builtin modules that are _not_ in the list. The list is created by opening the findmodulefiles output, reading it and eval()ing that. mkpycresource takes a list of (module, file) and creates a resourcefile with all those modules and (optionally) a main module. """ def findmodulefiles(output=None): """Produce a file containing a list of (modulename, filename-or-None) tuples mapping module names to source files""" # Immedeately grab the names import sys module_names = sys.modules.keys()[:] import os if not output: if os.name == 'mac': import macfs output, ok = macfs.StandardPutFile('Module file listing output:') if not ok: sys.exit(0) output = output.as_pathname() if not output: output = sys.stdout elif type(output) == type(''): output = open(output, 'w') output.write('[\n') for name in module_names: try: source = sys.modules[name].__file__ except AttributeError: source = None else: source = `source` output.write('\t(%s,\t%s),\n' % (`name`, source)) output.write(']\n') del output def findunusedbuiltins(list): """Produce (on stdout) a list of unused builtin modules""" import sys dict = {} for name, location in list: if location == None: dict[name] = 1 for name in sys.builtin_module_names: if not dict.has_key(name): print 'Unused builtin module:', name def mkpycresourcefile(list, main='', dst=None): """Copy list-of-modules to resource file dst.""" import py_resource import Res import sys if dst == None: import macfs fss, ok = macfs.StandardPutFile("PYC Resource output file") if not ok: sys.exit(0) dst = fss.as_pathname() if main == '': import macfs fss, ok = macfs.PromptGetFile("Main program:", "TEXT") if ok: main = fss.as_pathname() fsid = py_resource.create(dst) if main: id, name = py_resource.frompyfile(main, '__main__', preload=1) print '%5d\t%s\t%s'%(id, name, main) for name, location in list: if not location: continue if location[-4:] == '.pyc': # Attempt corresponding .py location = location[:-1] if location[-3:] != '.py': print '*** skipping', location continue id, name = py_resource.frompyfile(location, name, preload=1) print '%5d\t%s\t%s'%(id, name, location) Res.CloseResFile(fsid)