summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1996-09-03 18:19:12 (GMT)
committerGuido van Rossum <guido@python.org>1996-09-03 18:19:12 (GMT)
commit03dea6d026d53e920b897037b382c611575e24be (patch)
tree7c56704f5c1b9eaac9db9062651be5e15df73727
parent604cefa8df16232c064a2b246e392b13a9e473f6 (diff)
downloadcpython-03dea6d026d53e920b897037b382c611575e24be.zip
cpython-03dea6d026d53e920b897037b382c611575e24be.tar.gz
cpython-03dea6d026d53e920b897037b382c611575e24be.tar.bz2
Added uninstall option
-rw-r--r--PC/setup_nt/readme.txt30
-rw-r--r--PC/setup_nt/setup.py21
-rw-r--r--PC/setup_nt/uninstall.bat11
-rw-r--r--PC/setup_nt/uninstall.py78
4 files changed, 131 insertions, 9 deletions
diff --git a/PC/setup_nt/readme.txt b/PC/setup_nt/readme.txt
index 4b9bccc..eeca4ca 100644
--- a/PC/setup_nt/readme.txt
+++ b/PC/setup_nt/readme.txt
@@ -2,17 +2,19 @@ Python 1.4beta3 for Windows NT 3.5
==================================
The zip file pyth14b3.zip contains a preliminary binary release of
-Python 1.4beta3 for Windows NT 3.5, with Tcl/Tk support. The
-installation has not been tested on Windows '95 or Windows 3.1 with
-Win32s. For general information on Python, see http://www.python.org/.
+Python 1.4beta3 for Windows NT 3.5 and Windows '95, with Tcl/Tk
+support. The installation has not been tested on Windows 3.1 with
+Win32s. For general information on Python, see
+http://www.python.org/.
To install:
Unzip the archive in the root of a file system with enough space. It
will create a directory \Python1.4b3 containing subdirectories Bin and
-Lib and files setup.bat and setup.py. (If you don't have a zip
-program that supports long filenames, get the file winzip95.exe and
-install it -- this is WinZip 6.1 for 32-bit Windows systems.)
+Lib and some files, including setup.bat, setup.py, uninstall.bat, and
+uninstall.py. (If you don't have a zip program that supports long
+filenames, get the file winzip95.exe and install it -- this is WinZip
+6.1 for 32-bit Windows systems.)
Run the SETUP.BAT file found in directory just created. When it is
done, press Enter.
@@ -35,6 +37,10 @@ environment variables. E.g. if you installed Tcl/Tk in C:\TCL (the
default suggested by the installer), set TCL_LIBRARY to
"C:\TCL\lib\tcl7.5" and set TK_LIBRARY to "C:\TCL\lib\tk4.1".
+On Windows '95, you also need to add the directory "C:\TCL\bin" (or
+whereever the Tcl bin directory ended up) to the PATH environment
+variable. (Sorry, I don't know how to do this myself :-( )
+
Once Tcl/Tk is installed, you should be able to type the following
commands in Python:
@@ -44,6 +50,16 @@ commands in Python:
This creates a simple test dialog box (you may have to move the Python
window a bit to see it). Click on OK to get the Python prompt back.
-August 30, 1996
+To uninstall:
+
+Run the batch file UNINSTALL.BAT. This will run the Python script
+uninstall.py, which undoes the registry additions and removes most
+installed files. The batch file then proceed to remove some files
+that the Python script can't remove (because it's using them). The
+batch file ends with an error because it deletes itself. Hints on how
+to avoid this (and also on how to remove the installation directory
+itself) are gracefully accepted.
+
+September 3, 1996
--Guido van Rossum (home page: http://www.python.org/~guido/)
diff --git a/PC/setup_nt/setup.py b/PC/setup_nt/setup.py
index 3f8b117..4e3b774 100644
--- a/PC/setup_nt/setup.py
+++ b/PC/setup_nt/setup.py
@@ -1,4 +1,4 @@
-"""Setup script for Windows NT 3.5 until we have a proper installer.
+"""Setup script for Windows NT 3.5 and Windows 95.
Run this with the current directory set to the Python ``root''.
"""
@@ -171,9 +171,24 @@ win32api.RegCloseKey(corehandle)
#listtree(pythonhandle)
win32api.RegCloseKey(pythonhandle)
+print "Registering uninstaller..."
+pwd = nt.getcwd()
+uninstaller = '"%s\\uninstall.bat" "%s"' % (pwd, pwd)
+uninstallkey = \
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Python"+sys.winver
+try:
+ uihandle = win32api.RegOpenKey(roothandle, uninstallkey)
+except win32api.error, msg:
+ uihandle = win32api.RegCreateKey(roothandle, uninstallkey)
+win32api.RegSetValueEx(uihandle, "DisplayName", None, win32con.REG_SZ,
+ "Python "+sys.winver)
+win32api.RegSetValueEx(uihandle, "UninstallString", None, win32con.REG_SZ,
+ uninstaller)
+win32api.RegCloseKey(uihandle)
+
print "Registering Python Interpreter as shell for *.py files..."
pwd = nt.getcwd()
-interpreter = '"' + pwd + '\\Bin\\python.exe" -i %1'
+interpreter = '"%s\\Bin\\python.exe" -i "%%1"' % pwd
print "Interpreter command is", interpreter
root = win32con.HKEY_CLASSES_ROOT
sz = win32con.REG_SZ
@@ -227,6 +242,8 @@ Most common functions:
Get a handle for an existing subdirectory
RegCreateKey(handle, keypath) -> handle
Get a handle for a new subdirectory
+ RegDeleteKey(handle, key)
+ Delete the given subdirectory -- must be empty
RegCloseKey(handle)
Close a handle
RegGetValue(handle, subkey) -> string
diff --git a/PC/setup_nt/uninstall.bat b/PC/setup_nt/uninstall.bat
new file mode 100644
index 0000000..2806285
--- /dev/null
+++ b/PC/setup_nt/uninstall.bat
@@ -0,0 +1,11 @@
+cd "%1"
+bin\python.exe uninstall.py
+del lib\win\*.pyc
+del lib\win\*.pyd
+del lib\win\*.py
+rd lib\win
+rd lib
+del bin\*.exe
+del bin\*.dll
+rd bin
+del uninstall.*
diff --git a/PC/setup_nt/uninstall.py b/PC/setup_nt/uninstall.py
new file mode 100644
index 0000000..64f2a02
--- /dev/null
+++ b/PC/setup_nt/uninstall.py
@@ -0,0 +1,78 @@
+"""Uninstaller for Windows NT 3.5 and Windows 95.
+
+Actions:
+
+1. Remove our entries from the Registry:
+ - Software\Python\PythonCore\<winver>
+ - Software\Microsoft\Windows\CurrentVersion\Uninstall\Python<winver>
+ (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`