1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
"""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
from Carbon 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()
from Carbon import Res
try:
Res.FSpOpenResFile('RunLibScript.rsrc', 1)
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()
|