[Martin v. Löwis] > ... > Can somebody remember what the reason is to invoke cmd.exe (or COMSPEC) > in os.popen?
Absolutely necessary, as any number of shell gimmicks can be used in the passed string, same as on non-Windows boxes; .e.g., >>> import os >>> os.environ['STR'] = 'SSL' >>> p = os.popen("findstr %STR% *.py | sort") >>> print p.read() build_ssl.py: print " None of these versions appear suitable for building OpenSSL" build_ssl.py: print "Could not find an SSL directory in '%s'" % (sources,) build_ssl.py: print "Found an SSL directory at '%s'" % (best_name,) build_ssl.py: # Look for SSL 2 levels up from pcbuild - ie, same place zlib etc all live. ... That illustrates envar substitution and setting up a pipe in the passed string, and people certainly do things like that. These are the MS docs for cmd.exe's inscrutable quoting rules after /C: """ If /C or /K is specified, then the remainder of the command line after the switch is processed as a command line, where the following logic is used to process quote (") characters: 1. If all of the following conditions are met, then quote characters on the command line are preserved: - no /S switch - exactly two quote characters - no special characters between the two quote characters, where special is one of: &<>()@^| - there are one or more whitespace characters between the the two quote characters - the string between the two quote characters is the name of an executable file. 2. Otherwise, old behavior is to see if the first character is a quote character and if so, strip the leading character and remove the last quote character on the command line, preserving any text after the last quote character. """ Your cmd.exe /c "c:\Program Files\python25\python.exe" example fit clause #1 above. cmd.exe /c "c:\Program Files\python25\python.exe" -c "import sys;print sys.version" fails the "exactly two quote characters" part of #1, so falls into #2, and after stripping the first and last quotes leaves the senseless: cmd.exe /c c:\Program Files\python25\python.exe" -c "import sys;print sys.version > (i.e. doubling the quotes at the beginning and the end) [works] And that follows from the above, although not for a reason any sane person would guess :-( I personally wouldn't change anything here for 2.5. It's a minefield, and people who care a lot already have their own workarounds in place, which we'd risk breaking. It remains a minefield for newbies, but we're really just passing on cmd.exe's behaviors. People are well-advised to accept the installer's default directory. _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com