Index: Doc/library/subprocess.rst =================================================================== --- Doc/library/subprocess.rst (revision 77827) +++ Doc/library/subprocess.rst (working copy) @@ -51,11 +51,32 @@ sequence. A string will be treated as a sequence with the string as the only item (the program to execute). - On Unix, with *shell=True*: If args is a string, it specifies the command string - to execute through the shell. If *args* is a sequence, the first item specifies - the command string, and any additional items will be treated as additional shell - arguments. + .. note:: + :meth:`shlex.split` can be useful when determining the correct + tokenization for *args*, especially in complex cases:: + + >>> import shlex, subprocess + >>> command_line = raw_input() + /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "python -c 'print __name__'" + >>> shlex.split(command_line) + ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "python -c 'print __name__'"] + + Note in particular that options and their arguments go in separate list + elements, while arguments that need quoting when used in the shell + (such as filenames containing spaces or the python command shown + above) are single list elements. + + On Unix, with *shell=True*: If args is a string, it specifies the command + string to execute through the shell. This means that the string must + formatted exactly as it would be when typed at the shell prompt. This + includes, for example, quoting filenames with spaces in them. Additional + quoting may be required because the entire string is a Python string. It + may be useful to use a Python raw string in complex cases. If *args* is a + sequence, the first item specifies the command string, and any additional + items will be treated as additional arguments to the shell itself, following + the "-c" and the specified command string in the call to the shell. + On Windows: the :class:`Popen` class uses CreateProcess() to execute the child program, which operates on strings. If *args* is a sequence, it will be converted to a string using the :meth:`list2cmdline` method. Please note that