diff options
| -rw-r--r-- | Lib/py_compile.py | 95 | 
1 files changed, 63 insertions, 32 deletions
diff --git a/Lib/py_compile.py b/Lib/py_compile.py index 1adc3a209c..7d5837cc64 100644 --- a/Lib/py_compile.py +++ b/Lib/py_compile.py @@ -1,37 +1,68 @@ -# Routine to "compile" a .py file to a .pyc file. -# This has intimate knowledge of how Python/import.c does it. -# By Sjoerd Mullender (I forced him to write it :-). +"""Routine to "compile" a .py file to a .pyc (or .pyo) file. + +This module has intimate knowledge of the format of .pyc files. +"""  import imp  MAGIC = imp.get_magic()  def wr_long(f, x): -	f.write(chr( x        & 0xff)) -	f.write(chr((x >> 8)  & 0xff)) -	f.write(chr((x >> 16) & 0xff)) -	f.write(chr((x >> 24) & 0xff)) - -def compile(file, cfile = None): -	import os, marshal, __builtin__ -	f = open(file) -	try: -	    timestamp = os.fstat(file.fileno()) -	except AttributeError: -	    timestamp = long(os.stat(file)[8]) -	codestring = f.read() -	f.close() -	codeobject = __builtin__.compile(codestring, file, 'exec') -	if not cfile: -		cfile = file + (__debug__ and 'c' or 'o') -	fc = open(cfile, 'wb') -	fc.write('\0\0\0\0') -	wr_long(fc, timestamp) -	marshal.dump(codeobject, fc) -	fc.flush() -	fc.seek(0, 0) -	fc.write(MAGIC) -	fc.close() -	if os.name == 'mac': -		import macfs -		macfs.FSSpec(cfile).SetCreatorType('Pyth', 'PYC ') -		macfs.FSSpec(file).SetCreatorType('Pyth', 'TEXT') +    "Internal; write a 32-bit int to a file in little-endian order." +    f.write(chr( x        & 0xff)) +    f.write(chr((x >> 8)  & 0xff)) +    f.write(chr((x >> 16) & 0xff)) +    f.write(chr((x >> 24) & 0xff)) + +def compile(file, cfile=None, dfile=None): +    """Byte-compile one Python source file to Python bytecode. + +    Arguments: + +    file:  source filename +    cfile: target filename; defaults to source with 'c' or 'o' appended +	   ('c' normally, 'o' in optimizing mode, giving .pyc or .pyo) +    dfile: purported filename; defaults to source (this is the filename +	   that will show up in error messages) + +    Note that it isn't necessary to byte-compile Python modules for +    execution efficiency -- Python itself byte-compiles a module when +    it is loaded, and if it can, writes out the bytecode to the +    corresponding .pyc (or .pyo) file. + +    However, if a Python installation is shared between users, it is a +    good idea to byte-compile all modules upon installation, since +    other users may not be able to write in the source directories, +    and thus they won't be able to write the .pyc/.pyo file, and then +    they would be byte-compiling every module each time it is loaded. +    This can slow down program start-up considerably. + +    See compileall.py for a script/module that uses this module to +    byte-compile all installed files (or all files in selected +    directories). + +    """ +    import os, marshal, __builtin__ +    f = open(file) +    try: +	timestamp = os.fstat(file.fileno()) +    except AttributeError: +	timestamp = long(os.stat(file)[8]) +    codestring = f.read() +    f.close() +    if codestring and codestring[-1] != '\n': +	coestring = codestring + '\n' +    codeobject = __builtin__.compile(codestring, dfile or file, 'exec') +    if not cfile: +	cfile = file + (__debug__ and 'c' or 'o') +    fc = open(cfile, 'wb') +    fc.write('\0\0\0\0') +    wr_long(fc, timestamp) +    marshal.dump(codeobject, fc) +    fc.flush() +    fc.seek(0, 0) +    fc.write(MAGIC) +    fc.close() +    if os.name == 'mac': +	import macfs +	macfs.FSSpec(cfile).SetCreatorType('Pyth', 'PYC ') +	macfs.FSSpec(file).SetCreatorType('Pyth', 'TEXT')  | 
