summaryrefslogtreecommitdiffstats
path: root/Lib/distutils/spawn.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/distutils/spawn.py')
-rw-r--r--Lib/distutils/spawn.py79
1 files changed, 41 insertions, 38 deletions
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 @@ def spawn (cmd,
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.
-
- 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."""
-
+ 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.
+
+ 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 spawn (cmd,
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 @@ def _nt_quote_args (args):
# 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 @@ def _spawn_nt (cmd,
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 @@ def _spawn_posix (cmd,
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 @@ def _spawn_posix (cmd,
"command '%s' failed with exit status %d" % \
(cmd[0], exit_status)
- elif os.WIFSTOPPED (status):
+ elif os.WIFSTOPPED(status):
continue
else: