diff options
author | Guido van Rossum <guido@python.org> | 1998-03-05 03:42:00 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1998-03-05 03:42:00 (GMT) |
commit | 75dc4969ab202e8c3dda15bedacc880d589e1e44 (patch) | |
tree | 1dc5d67c772aba4027076eedeeddbe73c797257e /Tools/freeze/makefreeze.py | |
parent | 3455edcbc8fa586a6d3c70ea34e3c71b2763c98a (diff) | |
download | cpython-75dc4969ab202e8c3dda15bedacc880d589e1e44.zip cpython-75dc4969ab202e8c3dda15bedacc880d589e1e44.tar.gz cpython-75dc4969ab202e8c3dda15bedacc880d589e1e44.tar.bz2 |
Added support for packages.
We have a whole new module finder that uses the actual Python
parser and scans the bytecode for IMPORT_NAME and IMPORT_FROM.
This requires some support in import.c (that hasn't been checked in).
New command line options for this: -d, -q, -m.
Diffstat (limited to 'Tools/freeze/makefreeze.py')
-rw-r--r-- | Tools/freeze/makefreeze.py | 74 |
1 files changed, 18 insertions, 56 deletions
diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py index 5c6f371..97315b3 100644 --- a/Tools/freeze/makefreeze.py +++ b/Tools/freeze/makefreeze.py @@ -1,4 +1,5 @@ import marshal +import string # Write a file containing frozen code for the modules in the dictionary. @@ -23,51 +24,31 @@ main(argc, argv) """ -def makefreeze(outfp, dict): +def makefreeze(outfp, dict, debug=0): done = [] mods = dict.keys() mods.sort() for mod in mods: - modfn = dict[mod] - try: - str = makecode(modfn) - except IOError, msg: - sys.stderr.write("%s: %s\n" % (modfn, str(msg))) - continue - if str: - done.append(mod, len(str)) - writecode(outfp, mod, str) + m = dict[mod] + mangled = string.join(string.split(mod, "."), "__") + if m.__code__: + if debug: + print "freezing", mod, "..." + str = marshal.dumps(m.__code__) + size = len(str) + if m.__path__: + # Indicate package by negative size + size = -size + done.append((mod, mangled, size)) + writecode(outfp, mangled, str) + if debug: + print "generating table of frozen modules" outfp.write(header) - for mod, size in done: - outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mod, size)) + for mod, mangled, size in done: + outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size)) outfp.write(trailer) -# Return code string for a given module -- either a .py or a .pyc -# file. Return either a string or None (if it's not Python code). -# May raise IOError. - -def makecode(filename): - if filename[-3:] == '.py': - f = open(filename, 'r') - try: - text = f.read() - code = compile(text, filename, 'exec') - finally: - f.close() - return marshal.dumps(code) - if filename[-4:] == '.pyc': - f = open(filename, 'rb') - try: - f.seek(8) - str = f.read() - finally: - f.close() - return str - # Can't generate code for this extension - return None - - # Write a C initializer for a module containing the frozen python code. # The array is called M_<mod>. @@ -78,22 +59,3 @@ def writecode(outfp, mod, str): for c in str[i:i+16]: outfp.write('%d,' % ord(c)) outfp.write('\n};\n') - - -# Test for the above functions. - -def test(): - import os - import sys - if not sys.argv[1:]: - print 'usage: python freezepython.py file.py(c) ...' - sys.exit(2) - dict = {} - for arg in sys.argv[1:]: - base = os.path.basename(arg) - mod, ext = os.path.splitext(base) - dict[mod] = arg - makefreeze(sys.stdout, dict) - -if __name__ == '__main__': - test() |