System.IO.Ports.SerialPort implements IDisposable as a facility for freeing allocated resources (in your case the serial port itself). Using the with statement as the IronPython equivalent of C#'s using statement should help free the serial port on Thread.Abort
.
The script could be changed the following way:
import clr
clr.AddReference('System')
from System import *
with IO.Ports.SerialPort("COM3") as serialPort:
serialPort.BaudRate = 9600
serialPort.DataBits = 8
serialPort.Open()
while 1:
print serialPort.ReadLine()
Side-note (even though it is most likely out of your control): Aborting a thread is often considered as a bad practice (see for example the many questions around this topic) as it is not a safe way to handle external/untrusted/performance-hugging code because it does not guarantee abortion of the thread or provide proper isolation (compared to using app domains + policies). As you already experienced it is also inconvenient for the executed thread body/code.