diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py
index 651124d..1eed7a8 100644
--- a/Lib/distutils/spawn.py
+++ b/Lib/distutils/spawn.py
@@ -3,7 +3,8 @@
 Provides the 'spawn()' function, a front-end to various platform-
 specific functions for launching another program in a sub-process.
 Also provides the 'find_executable()' to search the path for a given
-executable name. """
+executable name.
+"""
 
 # created 1999/07/24, Greg Ward
 
@@ -19,24 +20,24 @@
            dry_run=0):
 
     """Run another program, specified as a command list 'cmd', in a new
-       process.  'cmd' is just the argument list for the new process, ie.
-       cmd[0] is the program to run and cmd[1:] are the rest of its
-       arguments.  There is no way to run a program with a name different
-       from that of its executable.
+    process.  'cmd' is just the argument list for the new process, ie.
+    cmd[0] is the program to run and cmd[1:] are the rest of its arguments.
+    There is no way to run a program with a name different from that of its
+    executable.
 
-       If 'search_path' is true (the default), the system's executable
-       search path will be used to find the program; otherwise, cmd[0] must
-       be the exact path to the executable.  If 'verbose' is true, a
-       one-line summary of the command will be printed before it is run.
-       If 'dry_run' is true, the command will not actually be run.
+    If 'search_path' is true (the default), the system's executable search
+    path will be used to find the program; otherwise, cmd[0] must be the
+    exact path to the executable.  If 'verbose' is true, a one-line summary
+    of the command will be printed before it is run.  If 'dry_run' is true,
+    the command will not actually be run.
 
-       Raise DistutilsExecError if running the program fails in any way;
-       just return on success."""
-
+    Raise DistutilsExecError if running the program fails in any way; just
+    return on success.
+    """
     if os.name == 'posix':
-        _spawn_posix (cmd, search_path, verbose, dry_run)
+        _spawn_posix(cmd, search_path, verbose, dry_run)
     elif os.name == 'nt':
-        _spawn_nt (cmd, search_path, verbose, dry_run)
+        _spawn_nt(cmd, search_path, verbose, dry_run)
     else:
         raise DistutilsPlatformError, \
               "don't know how to spawn programs on platform '%s'" % os.name
@@ -45,8 +46,10 @@
 
 
 def _nt_quote_args (args):
-    """Obscure quoting command line arguments on NT.
-       Simply quote every argument which contains blanks."""
+    """Quote command-line arguments for DOS/Windows conventions: just
+    wraps every argument which contains blanks in double quotes, and
+    returns a new argument list.
+    """
 
     # XXX this doesn't seem very robust to me -- but if the Windows guys
     # say it'll work, I guess I'll have to accept it.  (What if an arg
@@ -54,8 +57,8 @@
     # have to be escaped?  Is there an escaping mechanism other than
     # quoting?)
 
-    for i in range (len (args)):
-        if string.find (args[i], ' ') != -1:
+    for i in range(len(args)):
+        if string.find(args[i], ' ') != -1:
             args[i] = '"%s"' % args[i]
     return args
 
@@ -65,16 +68,16 @@
                dry_run=0):
 
     executable = cmd[0]
-    cmd = _nt_quote_args (cmd)
+    cmd = _nt_quote_args(cmd)
     if search_path:
         # either we find one or it stays the same
         executable = find_executable(executable) or executable 
     if verbose:
-        print string.join ([executable] + cmd[1:], ' ')
+        print string.join([executable] + cmd[1:], ' ')
     if not dry_run:
         # spawn for NT requires a full path to the .exe
         try:
-            rc = os.spawnv (os.P_WAIT, executable, cmd)
+            rc = os.spawnv(os.P_WAIT, executable, cmd)
         except OSError, exc:
             # this seems to happen when the command isn't found
             raise DistutilsExecError, \
@@ -91,39 +94,39 @@
                   dry_run=0):
 
     if verbose:
-        print string.join (cmd, ' ')
+        print string.join(cmd, ' ')
     if dry_run:
         return
     exec_fn = search_path and os.execvp or os.execv
 
-    pid = os.fork ()
+    pid = os.fork()
 
     if pid == 0:                        # in the child
         try:
             #print "cmd[0] =", cmd[0]
             #print "cmd =", cmd
-            exec_fn (cmd[0], cmd)
+            exec_fn(cmd[0], cmd)
         except OSError, e:
-            sys.stderr.write ("unable to execute %s: %s\n" %
-                              (cmd[0], e.strerror))
-            os._exit (1)
+            sys.stderr.write("unable to execute %s: %s\n" %
+                             (cmd[0], e.strerror))
+            os._exit(1)
             
-        sys.stderr.write ("unable to execute %s for unknown reasons" % cmd[0])
-        os._exit (1)
+        sys.stderr.write("unable to execute %s for unknown reasons" % cmd[0])
+        os._exit(1)
 
     
     else:                               # in the parent
         # Loop until the child either exits or is terminated by a signal
         # (ie. keep waiting if it's merely stopped)
         while 1:
-            (pid, status) = os.waitpid (pid, 0)
-            if os.WIFSIGNALED (status):
+            (pid, status) = os.waitpid(pid, 0)
+            if os.WIFSIGNALED(status):
                 raise DistutilsExecError, \
                       "command '%s' terminated by signal %d" % \
-                      (cmd[0], os.WTERMSIG (status))
+                      (cmd[0], os.WTERMSIG(status))
 
-            elif os.WIFEXITED (status):
-                exit_status = os.WEXITSTATUS (status)
+            elif os.WIFEXITED(status):
+                exit_status = os.WEXITSTATUS(status)
                 if exit_status == 0:
                     return              # hey, it succeeded!
                 else:
@@ -131,7 +134,7 @@
                           "command '%s' failed with exit status %d" % \
                           (cmd[0], exit_status)
         
-            elif os.WIFSTOPPED (status):
+            elif os.WIFSTOPPED(status):
                 continue
 
             else:
