On 13/06/2014 03:11, Nikolaus Rath wrote: > "R. David Murray" <rdmur...@bitdance.com> writes: >> Also notice that using a list with shell=True is using the API >> incorrectly. It wouldn't even work on Linux, so that torpedoes >> the cross-platform concern already :) >> >> This kind of confusion is why I opened http://bugs.python.org/issue7839. > > Can someone describe an use case where shell=True actually makes sense > at all?
On Windows (where I think the OP is), Popen & friends ultimately invoke CreateProcess. In the case where shell=True, subprocess invokes the command interpreter explictly under the covers and tweaks a few other things to avoid a Brief Flash of Unstyled Console. This is the relevant snippet from subprocess.py: if shell: startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW startupinfo.wShowWindow = _winapi.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = '{} /c "{}"'.format (comspec, args) That's all. It's more or less equivalent to your prefixing your commands with "cmd.exe /c". The only reasons you should need to do this are: * If you're using one of the few commands which are actually built-in to cmd.exe. I can't quickly find an online source for these, but typical examples will be: "dir" or "copy". * In some situations -- and I've never been able to nail this -- if you're trying to run a .bat/.cmd file. I've certainly been able to run batch files without shell=True but other people have failed within what appears to be the same configuration unless invoking cmd.exe via shell=True. I use hg.exe (from TortoiseHg) but ISTR that the base Mercurial install supplies a .bat/.cmd. If that's the OP's case then he might find it necessary to pass shell=True. TJG _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com