mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
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.
This commit is contained in:
parent
3455edcbc8
commit
75dc4969ab
4 changed files with 437 additions and 198 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue