123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- """Ways of dealing with macro-expanded code, e.g. caching or re-serializing it."""
- import os
- import shutil
- from macropy.core import unparse
- from py_compile import wr_long
- import marshal
- import imp
- class NullExporter(object):
- def export_transformed(self, code, tree, module_name, file_name):
- pass
- def find(self, file, pathname, description, module_name, package_path):
- pass
- class SaveExporter(object):
- def __init__(self, directory="exported", root=os.getcwd()):
- self.root = root
- self.directory = directory
- shutil.rmtree(directory, ignore_errors=True)
- shutil.copytree(root, directory)
- def export_transformed(self, code, tree, module_name, file_name):
- new_path = os.path.join(
- self.root,
- self.directory,
- os.path.relpath(file_name, self.root)
- )
- with open(new_path, "w") as f:
- f.write(unparse(tree))
- def find(self, file, pathname, description, module_name, package_path):
- pass
- suffix = __debug__ and 'c' or 'o'
- class PycExporter(object):
- def __init__(self, root=os.getcwd()):
- self.root = root
- def export_transformed(self, code, tree, module_name, file_name):
- f = open(file_name + suffix , 'wb')
- f.write('\0\0\0\0')
- timestamp = long(os.fstat(f.fileno()).st_mtime)
- wr_long(f, timestamp)
- marshal.dump(code, f)
- f.flush()
- f.seek(0, 0)
- f.write(imp.get_magic())
- def find(self, file, pathname, description, module_name, package_path):
- try:
- f = open(file.name + suffix, 'rb')
- py_time = os.fstat(file.fileno()).st_mtime
- pyc_time = os.fstat(f.fileno()).st_mtime
- if py_time > pyc_time:
- return None
- x = imp.load_compiled(module_name, pathname + suffix, f)
- return x
- except Exception, e:
- print e
|