OLD | NEW |
1 # coding=utf8 | 1 # coding=utf8 |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 """Collection of subprocess wrapper functions. | 5 """Collection of subprocess wrapper functions. |
6 | 6 |
7 In theory you shouldn't need anything else in subprocess, or this module failed. | 7 In theory you shouldn't need anything else in subprocess, or this module failed. |
8 """ | 8 """ |
9 | 9 |
10 import cStringIO | 10 import cStringIO |
(...skipping 16 matching lines...) Expand all Loading... |
27 TIMED_OUT = -2001 | 27 TIMED_OUT = -2001 |
28 | 28 |
29 # Globals. | 29 # Globals. |
30 # Set to True if you somehow need to disable this hack. | 30 # Set to True if you somehow need to disable this hack. |
31 SUBPROCESS_CLEANUP_HACKED = False | 31 SUBPROCESS_CLEANUP_HACKED = False |
32 | 32 |
33 | 33 |
34 class CalledProcessError(subprocess.CalledProcessError): | 34 class CalledProcessError(subprocess.CalledProcessError): |
35 """Augment the standard exception with more data.""" | 35 """Augment the standard exception with more data.""" |
36 def __init__(self, returncode, cmd, cwd, stdout, stderr): | 36 def __init__(self, returncode, cmd, cwd, stdout, stderr): |
37 super(CalledProcessError, self).__init__(returncode, cmd) | 37 super(CalledProcessError, self).__init__(returncode, cmd, output=stdout) |
38 self.stdout = stdout | 38 self.stdout = self.output # for backward compatibility. |
39 self.stderr = stderr | 39 self.stderr = stderr |
40 self.cwd = cwd | 40 self.cwd = cwd |
41 | 41 |
42 def __str__(self): | 42 def __str__(self): |
43 out = 'Command %s returned non-zero exit status %s' % ( | 43 out = 'Command %s returned non-zero exit status %s' % ( |
44 ' '.join(self.cmd), self.returncode) | 44 ' '.join(self.cmd), self.returncode) |
45 if self.cwd: | 45 if self.cwd: |
46 out += ' in ' + self.cwd | 46 out += ' in ' + self.cwd |
47 return '\n'.join(filter(None, (out, self.stdout, self.stderr))) | 47 return '\n'.join(filter(None, (out, self.stdout, self.stderr))) |
48 | 48 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 # Convert fork() emulation failure into a CygwinRebaseError(). | 240 # Convert fork() emulation failure into a CygwinRebaseError(). |
241 raise CygwinRebaseError( | 241 raise CygwinRebaseError( |
242 e.errno, | 242 e.errno, |
243 args, | 243 args, |
244 kwargs.get('cwd'), | 244 kwargs.get('cwd'), |
245 None, | 245 None, |
246 'Visit ' | 246 'Visit ' |
247 'http://code.google.com/p/chromium/wiki/CygwinDllRemappingFailure ' | 247 'http://code.google.com/p/chromium/wiki/CygwinDllRemappingFailure ' |
248 'to learn how to fix this error; you need to rebase your cygwin ' | 248 'to learn how to fix this error; you need to rebase your cygwin ' |
249 'dlls') | 249 'dlls') |
250 # Popen() can throw OSError when cwd or args[0] doesn't exist. Let it go | 250 # Popen() can throw OSError when cwd or args[0] doesn't exist. |
251 # through | 251 raise OSError('Execution failed with error: %s.\n' |
252 raise | 252 'Check that %s or %s exist and have execution permission.' |
| 253 % (str(e), kwargs.get('cwd'), args[0])) |
253 | 254 |
254 def _tee_threads(self, input): # pylint: disable=W0622 | 255 def _tee_threads(self, input): # pylint: disable=W0622 |
255 """Does I/O for a process's pipes using threads. | 256 """Does I/O for a process's pipes using threads. |
256 | 257 |
257 It's the simplest and slowest implementation. Expect very slow behavior. | 258 It's the simplest and slowest implementation. Expect very slow behavior. |
258 | 259 |
259 If there is a callback and it doesn't keep up with the calls, the timeout | 260 If there is a callback and it doesn't keep up with the calls, the timeout |
260 effectiveness will be delayed accordingly. | 261 effectiveness will be delayed accordingly. |
261 """ | 262 """ |
262 # Queue of either of <threadname> when done or (<threadname>, data). In | 263 # Queue of either of <threadname> when done or (<threadname>, data). In |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 | 504 |
504 Captures stdout of a process call and returns stdout only. | 505 Captures stdout of a process call and returns stdout only. |
505 | 506 |
506 - Throws if return code is not 0. | 507 - Throws if return code is not 0. |
507 - Works even prior to python 2.7. | 508 - Works even prior to python 2.7. |
508 - Blocks stdin by default if not specified since no output will be visible. | 509 - Blocks stdin by default if not specified since no output will be visible. |
509 - As per doc, "The stdout argument is not allowed as it is used internally." | 510 - As per doc, "The stdout argument is not allowed as it is used internally." |
510 """ | 511 """ |
511 kwargs.setdefault('stdin', VOID) | 512 kwargs.setdefault('stdin', VOID) |
512 if 'stdout' in kwargs: | 513 if 'stdout' in kwargs: |
513 raise ValueError('stdout argument not allowed, it will be overridden.') | 514 raise ValueError('stdout argument not allowed, it would be overridden.') |
514 return check_call_out(args, stdout=PIPE, **kwargs)[0] | 515 return check_call_out(args, stdout=PIPE, **kwargs)[0] |
OLD | NEW |