| """Add a 'PYC ' resource named "__main__" to a resource file. |
| |
| This first puts up a dialog asking for a Python source file ('TEXT'), |
| then one asking for an existing destination file ('APPL' or 'rsrc'). |
| |
| It compiles the Python source into a code object, marshals it into a string, |
| prefixes the string with a .pyc header, and turns it into a resource, |
| which is then written to the destination. |
| |
| If the destination already contains a resource with the same name and type, |
| it is overwritten. |
| """ |
| |
| import marshal |
| import imp |
| import macfs |
| from Res import * |
| |
| # .pyc file (and 'PYC ' resource magic number) |
| MAGIC = imp.get_magic() |
| |
| # Complete specification of our resource |
| RESTYPE = 'PYC ' |
| RESID = 128 |
| RESNAME = '__main__' |
| |
| # OpenResFile mode parameters |
| READ = 1 |
| WRITE = 2 |
| |
| def main(): |
| |
| # Ask for source text |
| |
| srcfss, ok = macfs.StandardGetFile('TEXT') |
| if not ok: return |
| |
| # Read the source and compile it |
| # (there's no point asking for a destination if it has a syntax error) |
| |
| filename = srcfss.as_pathname() |
| fp = open(filename) |
| text = fp.read() |
| fp.close() |
| code = compile(text, filename, "exec") |
| |
| # Ask for destination file |
| |
| dstfss, ok = macfs.StandardGetFile('APPL', 'rsrc') |
| if not ok: return |
| |
| # Create the raw data for the resource from the code object |
| |
| data = marshal.dumps(code) |
| del code |
| data = (MAGIC + '\0\0\0\0') + data |
| |
| # Open the resource file |
| |
| fnum = FSpOpenResFile(dstfss.as_pathname(), WRITE) |
| |
| # Delete any existing resource with name __main__ or number 128 |
| |
| try: |
| res = Get1NamedResource(RESTYPE, RESNAME) |
| res.RmveResource() |
| except Error: |
| pass |
| |
| try: |
| res = Get1Resource(RESTYPE, RESID) |
| res.RmveResource() |
| except Error: |
| pass |
| |
| # Create the resource and write it |
| |
| res = Resource(data) |
| res.AddResource(RESTYPE, RESID, RESNAME) |
| # XXX Are the following two calls needed? |
| res.WriteResource() |
| res.ReleaseResource() |
| |
| # Close the resource file |
| |
| CloseResFile(fnum) |
| |
| if __name__ == '__main__': |
| main() |