One more try (using popen instead of call is not necessary for these cases, but I want to see the behavior of popen):
shell=True and executable and at least one argument with spaces does not work: --------------------------------------------------------------------------------------------------------------------- p = subprocess.Popen([r"C:\Programs\GnuWin32\GetGnuWin32\gnuwin32\bin \Copy of cp.exe", r"C:\Temp\temp with spaces\test out.txt", r"C:\Temp\temp with spaces\test out3.txt"], shell=True, stdout=subprocess.PIPE) causes: 'C:\Programs\GnuWin32\GetGnuWin32\gnuwin32\bin\Copy' is not recognized as an int ernal or external command, operable program or batch file. the following all work: ================ without shell=True, and executable and at least one argument with spaces ----------------------------------------------------------------------------------------------------------- p = subprocess.Popen([r"C:\Programs\GnuWin32\GetGnuWin32\gnuwin32\bin \Copy of cp.exe", r"C:\Temp\temp with spaces\test out.txt", r"C:\Temp\temp with spaces\test out4.txt"], stdout=subprocess.PIPE) with shell=True, and executable without spaces, even if two arguments with spaces ------------------------------------------------------------------------------------------------------------------------ p = subprocess.Popen(["copy", r"C:\Temp\temp with spaces\test out.txt", r"C:\Temp\temp with spaces\test out2.txt"], shell=True, stdout=subprocess.PIPE) with shell=True, and executable without spaces, even if two arguments with spaces ------------------------------------------------------------------------------------------------------------------------ but here shell=True is not necessary p = subprocess.Popen([r"C:\Programs\GnuWin32\GetGnuWin32\gnuwin32\bin \cp.exe", r"C:\Temp\temp with spaces\test out.txt", r"C:\Temp\temp with spaces\test out5.txt"], shell=True, stdout=subprocess.PIPE) without shell=True, and executable and at least one arguments with spaces ------------------------------------------------------------------------------------------------------------- p = subprocess.Popen([r"C:\Programs\GnuWin32\GetGnuWin32\gnuwin32\bin \Copy of cp.exe", r"C:\Temp\temp with spaces\test out.txt", r"C:\Temp\temp with spaces\test out4.txt"], stdout=subprocess.PIPE) My conclusions: ============ Assuming shell=True is only required for build-in shell commands, non of which has spaces. There is no problem, if you know when *not* to use shell=True: * More than two arguments with spaces are never problem, as long as the executable does not have spaces * If shell=True is required, then the executable is a build-in shell command, which does not contain spaces, and, therefore, has no problems * If you use a non-build in executable, then don't use shell=True. This works correctly even if the executable and at least one additional argument have spaces. It took a lot of time to figure this out, but now at least I know, how to construct the call to subprocess.Popen, so that it works in the cases I used it so far. Josef -- http://mail.python.org/mailman/listinfo/python-list