What's the Scoop on \\ for Paths? (Win)

Alf P. Steinbach alfps at start.no
Sun Jan 31 21:36:57 CET 2010


* Tim Chase:
> Alf P. Steinbach wrote:
>> that you cannot write e.g. "c:\windows\system32", but must
>> write something like "c:\\windows\\system32" (try to print
>> that string), or, since Windows handles forward slashes as
>> well, you can write "c:/windows/system32" :-).
> 
> Forward slashes work for some relative paths for some commands but not 
> for others like absolute non-drive-specified paths:
> 
> Microsoft Windows XP [Version 5.1.2600]
> C:\>md abc
> C:\>md abc\123
> C:\>md abc\234
> C:\>cd abc
> C:\abc>tree /f /a
> Folder PATH listing
> Volume serial number is 940C-3F80
> C:.
> +---123
> |   \---234
> \---234
> 
> C:\abc>cd 123
> C:\abc\123>cd ../234
> C:\abc\234>type ../123/234/hello.txt
> The syntax of the command is incorrect.
> C:\abc\234>cd ../123
> C:\abc\123>cd /abc/123
> The system cannot find the path specified.
> C:\abc>x:
> X:\>type c:/abc/123/234/hello.txt
> The syntax of the command is incorrect.
> 
> #####
> The previous absolute-path fails in cmd.exe for a variety of apps 
> because the "/" is treated as a parameter/switch to the various 
> programs.

Yes, that's a valid concern when invoking external programs.


> Fortunately, the Python path-handling sub-system is smart 
> enough to do the right thing, even when Win32's internal handling is too 
> dumb to behave:
> 
> C:\abc\123>echo hello > 234/hello.txt
> C:\abc\123>cd ..
> C:\abc>tree /f /a
> Folder PATH listing
> Volume serial number is 940C-3F80
> C:.
> +---123
> |   \---234
> |           hello.txt
> |
> \---234
> 
> C:\abc>python
> Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on 
> win32
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> file('/abc/123/234/hello.txt').read()
> 'hello \n'

Oops, this is a dangerous misconception, because it can lead to Wrong Solutions 
to the perceived problems.

It's not the "Win32's internal handling" that you're up against above, but the 
generally unpredictable quirks of syntax and semantics of commands in the 
Windows command interpreter:

<example>
   C:\test> echo bah >foo.txt

   C:\test> type ../test/foo.txt
   The syntax of the command is incorrect.

   C:\test> type "../test/foo.txt"
   bah

   C:\test> _
</example>

Generally the details of that command interpreter are undocumented.


> So as long as you stick within Python's insulation, forward slashes are 
> a nice solution.

No, it's not Python's insulation that makes things work (although perhaps it 
redundantly tries to help), it's simply the Windows API, which generally accepts 
forward or backward slashes.

It's the same in other programming languages.

In particular, it's not a good idea to carry the idea of using backslashes over 
to #include directives in C or C++, thinking that there's no Python insulation 
there (at least one compiler accepts and Windows compilers used to accept it at 
one time, but it's invalid, and non-portable, whereas forward slashes work).


>  But if you have to interact with external programs, 
> use the \\ notation or raw strings:
> 
>   pth = r"c:\windows\system32"
> 
> [mutters under breath about Win32 headaches]

He he. Yes.

But anyways, the thing to remember is that when paths are passed to /programs/ 
in Windows, they generally need to be /quoted/.

That's particularly important for paths containing spaces.

For internal file handling in a program, including using libraries, forward 
slashes work fine  --  unless a library is particularly ill-behaved and requires 
backslashes  --  and provide some (but not complete) measure of portability.

For example,


<example>
   >>> f = open( "c:/foo.txt", "w" )
   >>> f.write( "works\n" )
   6
   >>> f.close()
   >>> f = open( "c:/foo.txt", "r" )
   >>> f.readlines()
   ['works\n']
   >>> f.close()
   >>> _
</example>


In retrospect, I should have been more clear about that distinction between 
invoking programs and invoking routines such as Python 'open', yes.

And as Steve Holden remarked else-thread, best practice for Python is to build 
paths using the os.path functionality.

E.g.,


<example>
   >>> import os.path
   >>> os.path.normpath( "c:/foo.txt" )
   'c:\\foo.txt'
   >>> _
</example>


Cheers & hth.,

- Alf



More information about the Python-list mailing list