How to install Python 1.4 on your Macintosh
------------------------------------------------

Even if you don't usually read readme files: please read at least the
first sections of this file, failure to do so will probably result in
an unuseable python system. If this warning is too late and you already
have an non-functional python: it is best to remove all traces and start
with a fresh distribution. Especially don't forget to remove the
"python 1.4 preferences" file from the Preferences folder, and possibly
"PythonCorePPC 1.4" and/or "PythonCoreCFM68K 1.4"
from the Extensions folder. Before you mail me for help *please*
try the steps above (cleaning up and re-installing): it should fix most
common mistakes. If you are installing a CFM68K python also check that
your installation of CFM68K was done correctly.

If this is your first encounter with Python: you definitely need the common
user documentation (common to all platforms). You can find this (in various
forms) on www.python.org and ftp.python.org.

Mac-specific documentation is included in this distribution in folder Mac:Demo.
The documentation is sparse, but it will have to serve for now. The documentation
is in HTML format, start with index.html.

If you have a pre-system 7 macintosh: sorry, this release will not work
on your system. Too many sys7 features are used to make a sys6 python
easy to create. If you really want one: tell me, maybe I can be convinced.
Alternatively: get the sources, put in the necessary gestalt() and
compatability calls yourself and send me the results.

If you don't have enough memory: the sizes choosen are somewhat arbitrary.
Try lowering them and seeing whether the resulting python is still usable.
Note, however, that python running out of memory may result in your mac
freezing. If this happens I would like to hear of it.

Note that if you're using Tk you might want to raise the memory size, tcl
and tk are quite a memory hog.

A final note to CFM68K (and possibly PPC) users: the Code Fragment Manager
can (incorrectly) produce "library not found" and other strange error messages
when it really means that there is not enough room in the system heap. Decreasing
(yes, *de*creasing) the size of the interpreter and/or enabling virtual memory
may solve these problems.

PowerPC and CFM68K Macintosh instructions
-----------------------------------------

For CFM68K you need a Mac with a 68020, 68030 or 68040, and at least System 7.1.1.
CFM68K Python will not run on PowerPC Macs. Before installing Python you
should install CFM68K. Put everything from the "CFM68K for System Folder" into the
Extensions folder and restart.

Run the MkPluginAliases applet. This will create an initial preferences file. 
Next, it will create a number of aliases in the PlugIns folder. Finally
it will put an alias to your PythonCore in the Extensions folder. The whole
process should be independent of any previous releases of Python on your disk
(and these releases should still continue working).
   
For all these things to work correctly it is vital that you don't move anything
around before running MkPluginAliases. After you have set things up you may
move things around to your hearts' desire.

Classic 68K Macintosh instructions
----------------------------------

Run Python68K. This will create an initial preferences file. Quit python.

Common instructions
-------------------

You should now have a functioning python. It is probably a good idea to run
"testall.py" from :Lib:test at this point, this should not give any errors.
Running testall.py is done by double-clicking it or dropping it onto the
interpreter.
Next, try "compileall.py" from :Lib to create all .pyc files (but this isn't
really important).

PPC and CFM68K users have a couple of applets in the main folder they may want to try,
(68K users can use the corresponding scripts from the "scripts" folder):

- EditPythonPrefs allows you to edit the preferences file, to change the
  python home folder or modify the initial sys.path setting.
  The default settings are somewhat arbitrary, you can remove tkinter if
  you don't use it and possibly add Extensions:img:Lib.
- mkapplet creates a python applet, a tiny application written
  in python. Drop a python source on it and out comes the application. More
  information can be found in the "Mac:Demo" folder.
  
PPC and CFM68K users will see one more files in the python folder: PythonApplet. This is
the template for building applets, leave it alone. For the 1.4b3 release the applet is
specific for your installation, i.e. PPC applets will not run on CFM68K machines and vice
versa. I hope to fix this soon.

Things to see
-------------

There are some readme files in the "Read me files" folder that may contain
useful information. There is also a first stab at documentation (plus examples)
in the Mac:Demo folder. The toplevel Demo folder has machine-independent demos.
See the file Readme-mac for mac-specific notes. The Mac:Lib:test folder also
has some programs that show simple capabilities of various modules.

The "scripts" folder has some sample scripts. Some are useful, some are just
interesting to look at to see how various things work. The MkDistr, mkapplet
and fullbuild scripts (plus the ones mentioned above) may help you to understand
how to use AppleEvents and various other toolboxes from python.

The 'img' group of modules, which handles I/O of many different image formats
(not pict yet, sigh:-) is included, but without documentation. You can find
docs at ftp://ftp.cwi.nl/pub/jack/python/img (or somewhere around there).

Upgrading from older Python releases
------------------------------------

Since release 1.4 Python releases are independent of each other, with separate
Preferences files, shared library names, etc. The good news is that this means you
can keep your older version around if you are unsure whether to upgrade. The bad
news is that your old preference settings are lost and you have to set them again.

After you are satisfied that 1.4 works as expected you can trash anything in the
system folder that has "python" in the name and not "1.4".

Feedback
--------

Send bug reports, suggestions, contributions and fanmail to <jack@cwi.nl>.
Be warned however that I'm pretty busy, so I may not always
respond immedeately.

A better way to discuss MacPython is to join the <pythonmac-sig@python.org>
mailing list, which is explicitly meant for this purpose.

Alternatively, you can try sending to comp.lang.python or python-list@cwi.nl,
but since I read the newsgroup, not the mailinglist, I may miss it there
(but other people may know quite a bit more than me anyway:-).

				Jack Jansen
				Centrum voor Wiskunde en Informatica
				Kruislaan 413
				1098 SJ  Amsterdam
				the Netherlands
				
				<jack@cwi.nl>, http://www.cwi.nl/~jack
