I'm new on this list, so please forgive me if I'm treading on familiar ground, but I didn't see this issue raised when I browsed through the last month or so of archives. Distutils for Windows NT,9x,2K seems to have a big hole in the way it forms command-lines for the compiler and friends: it doesn't account for the fact that filenames and pathnames may have spaces in them and thus may need to be quoted on the command-line passed to external tools (compiler, linker). Given that the standard Python 1.5.2 distribution installs itself on "C:\Program Files\Python" this leads to potentially problematic command-lines of the form cl -IC:\Program Files\Python\include link C:\Program Files\Python\Libs\python15.lib Both of these command lines will fail, because cl can't find the directory "C:\Program" and can't find "Files\Python\include.obj" and link can't find "C:\Program" or "Files\Python\Libs\python15.lib". CL and LINK both reparse the command-line so even if "-IC:/Program Files/Python/include" is passed as a single argument to os.spawnv(), it is split into two by cl's command-line parser: Python 1.5.2 (#0, Feb 2 2000, 22:07:42) [MSC 32 bit (Intel)] on win32 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> from distutils.spawn import * >>> spawn(['cl','-c','-IC:/Program Files/Python/include','client.cpp']) Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. Command line warning D4024 : unrecognized source file type 'Files/Python/include', object file assumed Command line warning D4027 : source file 'Files/Python/include' ignored client.cpp client.cpp(7) : fatal error C1083: Cannot open include file: 'python.h': No such file or directory Traceback (innermost last): File "<stdin>", line 1, in ? File "C:\Program Files\python\python-1.5.2\distutils\spawn.py", line 37, in spawn _spawn_nt (cmd, search_path, verbose, dry_run) File "C:\Program Files\python\python-1.5.2\distutils\spawn.py", line 74, in _spawn_nt raise DistutilsExecError, \ distutils.errors.DistutilsExecError: command 'cl' failed with exit status 2 >>> The command-lines should be: cl -I"C:\Program Files\Python\include" link "C:\Program Files\Python\Libs\python15.lib" which work: Python 1.5.2 (#0, Feb 2 2000, 22:07:42) [MSC 32 bit (Intel)] on win32 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> from distutils.spawn import * >>> spawn(['cl','-c','-I"C:/Program Files/Python/include"','client.cpp']) Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. client.cpp >>> I started hacking at the msvccompiler.py source to put quotes around filenames passed as arguments, but then realized that it would probably be better to implement a "wrapfilename(fname)" method in the ccompiler class and then subclass it appropriately for *ix (return fname) and WinNT (return '"%s"' % fname). Then every time a filename or path gets added to a command-line it must be processed with wrapfilename(). For instance: inputOpt = fileOpt + wrapfilename(srcFile) Does this sound like a reasonable approach? Am I missing a boat somewhere? Implementing this looks as thought it will require modifying (slightly) a number functions in ccompiler.py and msvccompiler.py, so I would like feedback from all of you more experienced folks on this list before I spend any time at it. I also might not be the best person to try, being a greenhorn and thus less prone to catch where such a modification would break existing code, but I am willing to make a pass at it if others don't have the time. Alternately, one could modify _spawn_nt to wrap each of its arguments in double-quotes, but that seems potentially more problematic (Some programs may not transparently discard quotation marks on command-line arguments. Consider the behavior of the find command.). Thanks for listening, Jonathan Gilligan