[Python-checkins] distutils2: Moving from spawn to subprocess.call for posix
tarek.ziade
python-checkins at python.org
Sun Jan 30 17:12:25 CET 2011
tarek.ziade pushed eaeb77441b82 to distutils2:
http://hg.python.org/distutils2/rev/eaeb77441b82
changeset: 983:eaeb77441b82
parent: 981:93d7c64c7a67
user: Andre Espaze <andre.espaze at logilab.fr>
date: Sun Jan 30 16:22:52 2011 +0100
summary:
Moving from spawn to subprocess.call for posix
files:
distutils2/tests/test_util.py
distutils2/util.py
diff --git a/distutils2/tests/test_util.py b/distutils2/tests/test_util.py
--- a/distutils2/tests/test_util.py
+++ b/distutils2/tests/test_util.py
@@ -414,6 +414,10 @@
@unittest.skipUnless(os.name in ('nt', 'posix'),
'runs only under posix or nt')
def test_spawn(self):
+ # Do not patch subprocess on unix because
+ # distutils2.util._spawn_posix uses it
+ if os.name in 'posix':
+ subprocess.Popen = self.old_popen
tmpdir = self.mkdtemp()
# creating something executable
diff --git a/distutils2/util.py b/distutils2/util.py
--- a/distutils2/util.py
+++ b/distutils2/util.py
@@ -12,6 +12,7 @@
import shutil
import tarfile
import zipfile
+from subprocess import call as sub_call
from copy import copy
from fnmatch import fnmatchcase
from ConfigParser import RawConfigParser
@@ -800,65 +801,17 @@
"command '%s' failed with exit status %d" % (cmd[0], rc))
-def _spawn_posix(cmd, search_path=1, verbose=0, dry_run=0, env=None):
- logger.info(' '.join(cmd))
+def _spawn_posix(cmd, search_path=1, verbose=1, dry_run=0, env=None):
+ cmd = ' '.join(cmd)
+ if verbose:
+ logger.info(cmd)
+ logger.info(env)
if dry_run:
return
-
- if env is None:
- exec_fn = search_path and os.execvp or os.execv
- else:
- exec_fn = search_path and os.execvpe or os.execve
-
- pid = os.fork()
-
- if pid == 0: # in the child
- try:
- if env is None:
- exec_fn(cmd[0], cmd)
- else:
- exec_fn(cmd[0], cmd, env)
- 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 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:
- try:
- pid, status = os.waitpid(pid, 0)
- except OSError, exc:
- import errno
- if exc.errno == errno.EINTR:
- continue
- raise DistutilsExecError(
- "command '%s' failed: %s" % (cmd[0], exc[-1]))
- if os.WIFSIGNALED(status):
- raise DistutilsExecError(
- "command '%s' terminated by signal %d" % \
- (cmd[0], os.WTERMSIG(status)))
-
- elif os.WIFEXITED(status):
- exit_status = os.WEXITSTATUS(status)
- if exit_status == 0:
- return # hey, it succeeded!
- else:
- raise DistutilsExecError(
- "command '%s' failed with exit status %d" % \
- (cmd[0], exit_status))
-
- elif os.WIFSTOPPED(status):
- continue
-
- else:
- raise DistutilsExecError(
- "unknown error executing '%s': termination status %d" % \
- (cmd[0], status))
-
+ exit_status = sub_call(cmd, shell=True, env=env)
+ if exit_status != 0:
+ msg = "command '%s' failed with exit status %d"
+ raise DistutilsExecError(msg % (cmd, exit_status))
def find_executable(executable, path=None):
"""Tries to find 'executable' in the directories listed in 'path'.
--
Repository URL: http://hg.python.org/distutils2
More information about the Python-checkins
mailing list