| """Import a module while pretending its name is __main__. This |
| can be used to run scripts from the PackedLib resource file while pretending |
| they have been double-clicked.""" |
| |
| import imp |
| import sys |
| import os |
| import string |
| import Dlg |
| import macfs |
| |
| DIALOG_ID = 512 |
| OK = 1 |
| CANCEL = 2 |
| SCRIPTNAME=3 |
| ARGV=4 |
| STDIN_CONS=5 |
| STDIN_FILE=6 |
| STDOUT_CONS=7 |
| STDOUT_FILE=8 |
| WORKING_DIR=9 |
| PAUSE=10 |
| |
| def import_as_main(name): |
| fp, path, (suffix, mode, type) = imp.find_module(name) |
| if type == imp.PY_SOURCE: |
| imp.load_source('__main__', path, fp) |
| elif type == imp.PY_COMPILED: |
| imp.load_compiled('__main__', path, fp) |
| elif type == imp.PY_RESOURCE: |
| imp.load_resource('__main__', path) |
| |
| def interact(): |
| d = Dlg.GetNewDialog(DIALOG_ID, -1) |
| wdir = stdin = stdout = None |
| pause = 0 |
| |
| tp, in_c_h, rect = d.GetDialogItem(STDIN_CONS) |
| tp, in_f_h, rect = d.GetDialogItem(STDIN_FILE) |
| tp, out_c_h, rect = d.GetDialogItem(STDOUT_CONS) |
| tp, out_f_h, rect = d.GetDialogItem(STDOUT_FILE) |
| tp, pause_h, rect = d.GetDialogItem(PAUSE) |
| in_c_h = in_c_h.as_Control() |
| in_f_h = in_f_h.as_Control() |
| out_c_h = out_c_h.as_Control() |
| out_f_h = out_f_h.as_Control() |
| pause_h = pause_h.as_Control() |
| |
| while 1: |
| in_c_h.SetControlValue(not stdin) |
| in_f_h.SetControlValue(not not stdin) |
| out_c_h.SetControlValue(not stdout) |
| out_f_h.SetControlValue(not not stdout) |
| pause_h.SetControlValue(pause) |
| |
| n = Dlg.ModalDialog(None) |
| if n == OK: |
| break |
| elif n == CANCEL: |
| sys.exit(0) |
| elif n == STDIN_CONS: |
| stdin = None |
| elif n == STDIN_FILE: |
| fss, ok = macfs.StandardGetFile('TEXT') |
| if ok: |
| stdin = fss |
| elif n == STDOUT_FILE: |
| fss, ok = macfs.StandardPutFile('stdout:') |
| if ok: |
| stdout = fss |
| elif n == WORKING_DIR: |
| fss, ok = macfs.GetDirectory() |
| if ok: |
| wdir = fss |
| elif n == PAUSE: |
| pause = (not pause) |
| |
| tp, h, rect = d.GetDialogItem(SCRIPTNAME) |
| name = Dlg.GetDialogItemText(h) |
| tp, h, rect = d.GetDialogItem(ARGV) |
| argv = Dlg.GetDialogItemText(h) |
| return name, argv, stdin, stdout, wdir, pause |
| |
| def main(): |
| curdir = os.getcwd() |
| import Res |
| try: |
| Res.OpenResFile('RunLibScript.rsrc') |
| except: |
| pass # Assume we're an applet already |
| name, argv, stdin, stdout, wdir, pause = interact() |
| if not name: |
| sys.exit(0) |
| sys.argv = [name] + string.split(argv) |
| if stdin: |
| sys.stdin = open(stdin.as_pathname()) |
| if stdout: |
| sys.stdout = open(stdout.as_pathname(), 'w') |
| if wdir: |
| os.chdir(wdir.as_pathname()) |
| else: |
| os.chdir(curdir) |
| |
| import_as_main(name) |
| |
| if pause: |
| sys.exit(1) |
| |
| if __name__ == '__main__': |
| main() |
| |