Write a simple Python shell with a GUI. The shell should use Python functions whenever possible to make it as portable as it can be. This is another project that can be divided into phases:
i) Write the shell GUI. It should have a spot to enter commands and a scrollable output screen.
ii) Write the command parser. Have the shell recognize a limited subset of commands. If it sees those commands, it does the appropriate thing in Python - otherwise, it hands the command to the OS and reproduces the output on its screen. The list of commands the program should recognize are: cd, ls, clear, echo, exit, pwd, touch, rm, mkdir, rmdir, mv, cp, chmod, and ps. Most of these can be written in Python, but some may have to be redirected to the OS.
iii) Add a command history feature, so that pressing the up and down arrow keys lets you cycle through previously entered commands.
iv) Add the ability to run a command in the background by adding an & to it.
v) Add the ability to redirect output using > and >>.
vi) If you're feeling particularly ambitious, try to add tab-completion.
vii) If you're feeling very, very ambitious, try to add pipes!
I tried to do this before, and got stuck on (iii). I figured out that (using Tkinter) I needed threads to monitor up/down arrow keypresses, and I didn't have the energy to deal with threading at the time.