|
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
|
2 # Use of this source code is governed by a BSD-style license that can be |
|
3 # found in the LICENSE file. |
|
4 |
|
5 """A wrapper for subprocess to make calling shell commands easier.""" |
|
6 |
|
7 |
|
8 import logging |
|
9 import subprocess |
|
10 |
|
11 |
|
12 def RunCmd(args, cwd=None): |
|
13 """Opens a subprocess to execute a program and returns its return value. |
|
14 |
|
15 Args: |
|
16 args: A string or a sequence of program arguments. The program to execute is |
|
17 the string or the first item in the args sequence. |
|
18 cwd: If not None, the subprocess's current directory will be changed to |
|
19 |cwd| before it's executed. |
|
20 |
|
21 Returns: |
|
22 Return code from the command execution. |
|
23 """ |
|
24 logging.info(str(args) + ' ' + (cwd or '')) |
|
25 p = subprocess.Popen(args=args, cwd=cwd) |
|
26 return p.wait() |
|
27 |
|
28 |
|
29 def GetCmdOutput(args, cwd=None, shell=False): |
|
30 """Open a subprocess to execute a program and returns its output. |
|
31 |
|
32 Args: |
|
33 args: A string or a sequence of program arguments. The program to execute is |
|
34 the string or the first item in the args sequence. |
|
35 cwd: If not None, the subprocess's current directory will be changed to |
|
36 |cwd| before it's executed. |
|
37 shell: Whether to execute args as a shell command. |
|
38 |
|
39 Returns: |
|
40 Captures and returns the command's stdout. |
|
41 Prints the command's stderr to logger (which defaults to stdout). |
|
42 """ |
|
43 logging.info(str(args) + ' ' + (cwd or '')) |
|
44 p = subprocess.Popen(args=args, cwd=cwd, stdout=subprocess.PIPE, |
|
45 stderr=subprocess.PIPE, shell=shell) |
|
46 stdout, stderr = p.communicate() |
|
47 if stderr: |
|
48 logging.critical(stderr) |
|
49 logging.info(stdout[:4096]) # Truncate output longer than 4k. |
|
50 return stdout |