78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
|
# 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)
|