A new home for scripts/applets
EditPythonPrefs - Edit the preferences file (sys.path, python home)
PackLibDir - Convert a sys.path directory to a resource file
RunLibScript - import a module and run as __main__
mkapplet - Create a python applet

The resource files belonging to these should also be stored here, somehow..
diff --git a/Mac/scripts/EditPythonPrefs.py b/Mac/scripts/EditPythonPrefs.py
new file mode 100644
index 0000000..3e14ff3
--- /dev/null
+++ b/Mac/scripts/EditPythonPrefs.py
@@ -0,0 +1,168 @@
+"""Edit the Python Preferences file."""
+import addpack
+addpack.addpack('Tools')
+addpack.addpack('bgen')
+addpack.addpack('evt')
+
+from Dlg import *
+from Events import *
+from Res import *
+import string
+import struct
+import macfs
+import MacOS
+import os
+import sys
+import Res # For Res.Error
+
+# resource IDs in our own resources (dialogs, etc)
+MESSAGE_ID = 256
+
+DIALOG_ID = 131
+TEXT_ITEM = 1
+OK_ITEM = 2
+CANCEL_ITEM = 3
+REVERT_ITEM = 4
+DIR_ITEM = 5
+
+# Resource IDs in the preferences file
+PATH_STRINGS_ID = 128
+DIRECTORY_ID = 128
+
+WRITE = 2
+smAllScripts = -3
+kOnSystemDisk = 0x8000
+
+def restolist(data):
+	"""Convert STR# resource data to a list of strings"""
+	if not data:
+		return []
+	num, = struct.unpack('h', data[:2])
+	data = data[2:]
+	rv = []
+	for i in range(num):
+		strlen = ord(data[0])
+		if strlen < 0: strlen = strlen + 256
+		str = data[1:strlen+1]
+		data = data[strlen+1:]
+		rv.append(str)
+	return rv
+	
+def listtores(list):
+	"""Convert a list of strings to STR# resource data"""
+	rv = struct.pack('h', len(list))
+	for str in list:
+		rv = rv + chr(len(str)) + str
+	return rv
+
+def message(str = "Hello, world!", id = MESSAGE_ID):
+	"""Show a simple alert with a text message"""
+	d = GetNewDialog(id, -1)
+	print 'd=', d
+	tp, h, rect = d.GetDialogItem(2)
+	SetDialogItemText(h, str)
+	while 1:
+		n = ModalDialog(None)
+		if n == 1: break
+		
+def interact(list, pythondir):
+	"""Let the user interact with the dialog"""
+	opythondir = pythondir
+	try:
+		# Try to go to the "correct" dir for GetDirectory
+		os.chdir(pythondir.as_pathname())
+	except os.error:
+		pass
+	d = GetNewDialog(DIALOG_ID, -1)
+	tp, h, rect = d.GetDialogItem(1)
+	SetDialogItemText(h, string.joinfields(list, '\r'))
+	while 1:
+		n = ModalDialog(None)
+		if n == OK_ITEM:
+			break
+		if n == CANCEL_ITEM:
+			return None
+		if n == REVERT_ITEM:
+			return [], pythondir
+		if n == DIR_ITEM:
+			fss, ok = macfs.GetDirectory()
+			if ok:
+				pythondir = fss
+	tmp = string.splitfields(GetDialogItemText(h), '\r')
+	rv = []
+	for i in tmp:
+		if i:
+			rv.append(i)
+	return rv, pythondir
+	
+def main():
+	try:
+		h = OpenResFile('EditPythonPrefs.rsrc')
+	except Res.Error:
+		pass	# Assume we already have acces to our own resource
+	
+	# Find the preferences folder and our prefs file, create if needed.	
+	vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
+	preff_fss = macfs.FSSpec((vrefnum, dirid, 'Python Preferences'))
+	try:
+		preff_handle = FSpOpenResFile(preff_fss, WRITE)
+	except Res.Error:
+		# Create it
+		message('No preferences file, creating one...')
+		FSpCreateResFile(preff_fss, 'PYTH', 'pref', smAllScripts)
+		preff_handle = FSpOpenResFile(preff_fss, WRITE)
+		
+	# Load the path and directory resources
+	try:
+		sr = GetResource('STR#', PATH_STRINGS_ID)
+	except (MacOS.Error, Res.Error):
+		message('Cannot find any sys.path resource! (Old python?)')
+		sys.exit(0)
+	d = sr.data
+	l = restolist(d)
+	
+	try:
+		dr = GetResource('alis', DIRECTORY_ID)
+		fss, fss_changed = macfs.RawAlias(dr.data).Resolve()
+	except (MacOS.Error, Res.Error):
+		dr = None
+		fss = macfs.FSSpec(os.getcwd())
+		fss_changed = 1
+	
+	# Let the user play away
+	result = interact(l, fss)
+	
+	# See what we have to update, and how
+	if result == None:
+		sys.exit(0)
+		
+	pathlist, nfss = result
+	if nfss != fss:
+		fss_changed = 1
+		
+	if fss_changed or pathlist != l:
+		if fss_changed:
+			alias = nfss.NewAlias()
+			if dr:
+				dr.data = alias.data
+				dr.ChangedResource()
+			else:
+				dr = Resource(alias.data)
+				dr.AddResource('alis', DIRECTORY_ID, '')
+				
+		if pathlist != l:
+			if pathlist == []:
+				if sr.HomeResFile() == preff_handle:
+					sr.RemoveResource()
+			elif sr.HomeResFile() == preff_handle:
+				sr.data = listtores(pathlist)
+				sr.ChangedResource()
+			else:
+				sr = Resource(listtores(pathlist))
+				sr.AddResource('STR#', PATH_STRINGS_ID, '')
+				
+	CloseResFile(preff_handle)
+
+if __name__ == '__main__':
+	print # Stupid, to init toolboxes...
+	main()