RunLibScript.py 2.5 KB
Newer Older
1 2 3 4 5 6 7 8
"""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
9
from Carbon import Dlg
10 11
import macfs

12
DIALOG_ID = 512
13 14 15 16 17 18 19 20 21 22 23 24 25 26
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:
27
		imp.load_source('__main__', path, fp)
28
	elif type == imp.PY_COMPILED:
29
		imp.load_compiled('__main__', path, fp)
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
	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()
86
	from Carbon import Res
87
	try:
88
		Res.FSpOpenResFile('RunLibScript.rsrc', 1)
89 90
	except:
		pass # Assume we're an applet already
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
	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()