"""Uninstaller for Windows NT 3.5 and Windows 95. Actions: 1. Remove our entries from the Registry: - Software\Python\PythonCore\ - Software\Microsoft\Windows\CurrentVersion\Uninstall\Python (Should we also remove the entry for .py and Python.Script?) 2. Remove the installation tree -- this is assumed to be the directory whose path is both os.path.dirname(sys.argv[0]) and sys.path[0] """ import sys import nt import os import win32api import win32con def rmkey(parent, key, level=0): sep = " "*level try: handle = win32api.RegOpenKey(parent, key) except win32api.error, msg: print sep + "No key", `key` return print sep + "Removing key", key while 1: try: subkey = win32api.RegEnumKey(handle, 0) except win32api.error, msg: break rmkey(handle, subkey, level+1) win32api.RegCloseKey(handle) win32api.RegDeleteKey(parent, key) print sep + "Done with", key roothandle = win32con.HKEY_LOCAL_MACHINE pythonkey = "Software\\Python\\PythonCore\\" + sys.winver rmkey(roothandle, pythonkey) uninstallkey = \ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Python"+sys.winver rmkey(roothandle, uninstallkey) def rmtree(dir, level=0): sep = " "*level print sep+"rmtree", dir for name in os.listdir(dir): if level == 0 and \ os.path.normcase(name) == os.path.normcase("uninstall.bat"): continue fn = os.path.join(dir, name) if os.path.isdir(fn): rmtree(fn, level+1) else: try: os.remove(fn) except os.error, msg: print sep+" can't remove", `fn`, msg else: print sep+" removed", `fn` try: os.rmdir(dir) except os.error, msg: print sep+"can't remove directory", `dir`, msg else: print sep+"removed directory", `dir` pwd = os.getcwd() scriptdir = os.path.normpath(os.path.join(pwd, os.path.dirname(sys.argv[0]))) pathdir = os.path.normpath(os.path.join(pwd, sys.path[0])) if scriptdir == pathdir: rmtree(pathdir) else: print "inconsistend script directory, not removing any files." print "script directory =", `scriptdir` print "path directory =", `pathdir`