This directory contains various demonstrations of what you can do with
Python.  They were all written by me except where explicitly stated
otherwise -- in general, demos contributed by others ends up in the
../Contrib directory, unless I think they're of utmost general
importance (like Matt Conway's Tk demos).

A fair number of utilities that are useful when while developing
Python code can be found in the ../Tools directory -- some of these
can also be considered good examples of how to write Python code.

Finally, in order to save disk space and net bandwidth, not all
subdirectories listed here are distributed.  They are listed just
in case I change my mind about them.


classes		Some examples of how to use classes.

embed		An example of embedding Python in another application
		(see also pysvr).

extend		An example of using the generic Makefile.pre.in from
		the Misc directory to build a statically linked or
		shared extension module.

md5test		Test program for the optional md5 module.

pysvr		An example of embedding Python in a threaded
		application.

rpc		A set of classes for building clients and servers for
		Sun RPC.

scripts		Some useful Python scripts that I put in my bin
		directory.  No optional built-in modules needed.

sockets		Examples for the new built-in module 'socket'.

sgi		Demos that only run on Silicon Graphics machines.
		These require at least one of the optional built-in
		modules that only make sense for the SGI, such as
		'gl', 'al', and 'sv'.  Split in subdirectories
		per subject.

threads		Demos that use the 'thread' module.  (Currently these
		only run on SGIs, but this may change in the future.)

tkinter		Demos using the Tk interface (including Matt Conway's
		excellent set of demos).
