While agreeing with the answers given by Reed Copsey and Alex Martelli, I"d like to point out one further difference - the Global Interpreter Lock (GIL). While IronPython doesn"t have the limitations of the GIL, CPython does - so it would appear that for those applications where the GIL is a bottleneck, say in certain multicore scenarios, IronPython has an advantage over Python.NET.
From the Python.NET documentation:
Important Note for embedders: Python
is not free-threaded and uses a global
interpreter lock to allow
multi-threaded applications to
interact safely with the Python
interpreter. Much more information
about this is available in the Python
C API documentation on the
www.python.org Website.
When embedding Python in a managed
application, you have to manage the
GIL in just the same way you would
when embedding Python in a C or C++
application.
Before interacting with any of the
objects or APIs provided by the
Python.Runtime namespace, calling code
must have acquired the Python global
interpreter lock by calling the
PythonEngine.AcquireLock method. The
only exception to this rule is the
PythonEngine.Initialize method, which
may be called at startup without
having acquired the GIL.
When finished using Python APIs,
managed code must call a corresponding
PythonEngine.ReleaseLock to release
the GIL and allow other threads to use
Python.
The AcquireLock and ReleaseLock
methods are thin wrappers over the
unmanaged PyGILState_Ensure and
PyGILState_Release functions from the
Python API, and the documentation for
those APIs applies to the managed
versions.
Another issue is IDE support. CPython probably has better IDE support at present than IronPython - so this may be a factor in the choosing of one over the other.