| # subprocess - Subprocesses with accessible I/O streams |
| # |
| # For more information about this module, see PEP 324. |
| # |
| # This module should remain compatible with Python 2.2, see PEP 291. |
| # |
| # Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se> |
| # |
| # Licensed to PSF under a Contributor Agreement. |
| # See http://www.python.org/2.4/license for licensing details. |
| |
| def list2cmdline(seq): |
| """ |
| Translate a sequence of arguments into a command line |
| string, using the same rules as the MS C runtime: |
| |
| 1) Arguments are delimited by white space, which is either a |
| space or a tab. |
| |
| 2) A string surrounded by double quotation marks is |
| interpreted as a single argument, regardless of white space |
| contained within. A quoted string can be embedded in an |
| argument. |
| |
| 3) A double quotation mark preceded by a backslash is |
| interpreted as a literal double quotation mark. |
| |
| 4) Backslashes are interpreted literally, unless they |
| immediately precede a double quotation mark. |
| |
| 5) If backslashes immediately precede a double quotation mark, |
| every pair of backslashes is interpreted as a literal |
| backslash. If the number of backslashes is odd, the last |
| backslash escapes the next double quotation mark as |
| described in rule 3. |
| """ |
| |
| # See |
| # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp |
| result = [] |
| needquote = False |
| for arg in seq: |
| bs_buf = [] |
| |
| # Add a space to separate this argument from the others |
| if result: |
| result.append(' ') |
| |
| needquote = (" " in arg) or ("\t" in arg) or ("|" in arg) or arg == "" |
| if needquote: |
| result.append('"') |
| |
| for c in arg: |
| if c == '\\': |
| # Don't know if we need to double yet. |
| bs_buf.append(c) |
| elif c == '"': |
| # Double backspaces. |
| result.append('\\' * len(bs_buf)*2) |
| bs_buf = [] |
| result.append('\\"') |
| else: |
| # Normal char |
| if bs_buf: |
| result.extend(bs_buf) |
| bs_buf = [] |
| result.append(c) |
| |
| # Add remaining backspaces, if any. |
| if bs_buf: |
| result.extend(bs_buf) |
| |
| if needquote: |
| result.extend(bs_buf) |
| result.append('"') |
| |
| return ''.join(result) |