blob: 3a9ab7e056c94be07d655980ab53a19e7cd5b24c [file] [log] [blame]
Jack Jansen7571f301995-07-29 13:48:41 +00001"""Import a module while pretending its name is __main__. This
2can be used to run scripts from the PackedLib resource file while pretending
3they have been double-clicked."""
4
5import imp
6import sys
7import os
8import string
9import Dlg
10import macfs
11
Jack Jansen9062fa21995-08-14 12:21:12 +000012DIALOG_ID = 512
Jack Jansen7571f301995-07-29 13:48:41 +000013OK = 1
14CANCEL = 2
15SCRIPTNAME=3
16ARGV=4
17STDIN_CONS=5
18STDIN_FILE=6
19STDOUT_CONS=7
20STDOUT_FILE=8
21WORKING_DIR=9
22PAUSE=10
23
24def import_as_main(name):
25 fp, path, (suffix, mode, type) = imp.find_module(name)
26 if type == imp.PY_SOURCE:
Jack Jansenfbac4bb1995-08-31 13:46:13 +000027 imp.load_source('__main__', path, fp)
Jack Jansen7571f301995-07-29 13:48:41 +000028 elif type == imp.PY_COMPILED:
Jack Jansenfbac4bb1995-08-31 13:46:13 +000029 imp.load_compiled('__main__', path, fp)
Jack Jansen7571f301995-07-29 13:48:41 +000030 elif type == imp.PY_RESOURCE:
31 imp.load_resource('__main__', path)
32
33def interact():
34 d = Dlg.GetNewDialog(DIALOG_ID, -1)
35 wdir = stdin = stdout = None
36 pause = 0
37
38 tp, in_c_h, rect = d.GetDialogItem(STDIN_CONS)
39 tp, in_f_h, rect = d.GetDialogItem(STDIN_FILE)
40 tp, out_c_h, rect = d.GetDialogItem(STDOUT_CONS)
41 tp, out_f_h, rect = d.GetDialogItem(STDOUT_FILE)
42 tp, pause_h, rect = d.GetDialogItem(PAUSE)
43 in_c_h = in_c_h.as_Control()
44 in_f_h = in_f_h.as_Control()
45 out_c_h = out_c_h.as_Control()
46 out_f_h = out_f_h.as_Control()
47 pause_h = pause_h.as_Control()
48
49 while 1:
50 in_c_h.SetControlValue(not stdin)
51 in_f_h.SetControlValue(not not stdin)
52 out_c_h.SetControlValue(not stdout)
53 out_f_h.SetControlValue(not not stdout)
54 pause_h.SetControlValue(pause)
55
56 n = Dlg.ModalDialog(None)
57 if n == OK:
58 break
59 elif n == CANCEL:
60 sys.exit(0)
61 elif n == STDIN_CONS:
62 stdin = None
63 elif n == STDIN_FILE:
64 fss, ok = macfs.StandardGetFile('TEXT')
65 if ok:
66 stdin = fss
67 elif n == STDOUT_FILE:
68 fss, ok = macfs.StandardPutFile('stdout:')
69 if ok:
70 stdout = fss
71 elif n == WORKING_DIR:
72 fss, ok = macfs.GetDirectory()
73 if ok:
74 wdir = fss
75 elif n == PAUSE:
76 pause = (not pause)
77
78 tp, h, rect = d.GetDialogItem(SCRIPTNAME)
79 name = Dlg.GetDialogItemText(h)
80 tp, h, rect = d.GetDialogItem(ARGV)
81 argv = Dlg.GetDialogItemText(h)
82 return name, argv, stdin, stdout, wdir, pause
83
84def main():
85 curdir = os.getcwd()
86 import Res
Jack Jansenfbac4bb1995-08-31 13:46:13 +000087 try:
88 Res.OpenResFile('RunLibScript.rsrc')
89 except:
90 pass # Assume we're an applet already
Jack Jansen7571f301995-07-29 13:48:41 +000091 name, argv, stdin, stdout, wdir, pause = interact()
92 if not name:
93 sys.exit(0)
94 sys.argv = [name] + string.split(argv)
95 if stdin:
96 sys.stdin = open(stdin.as_pathname())
97 if stdout:
98 sys.stdout = open(stdout.as_pathname(), 'w')
99 if wdir:
100 os.chdir(wdir.as_pathname())
101 else:
102 os.chdir(curdir)
103
104 import_as_main(name)
105
106 if pause:
107 sys.exit(1)
108
109if __name__ == '__main__':
110 main()
111