eryksun added the comment:
This should be fixed in os.symlink. The Windows CreateSymbolicLink function
can't be relied on to translate slash to backslash. It only normalizes an
absolute link, or a path that's relative to the current working directory on a
drive (e.g. "R:../crypto") since that's stored as an absolute link.
For example:
>>> os.symlink('C:/Program Files/Python34', 'Python34')
>>> os.system('fsutil reparsepoint query Python34')
Reparse Tag Value : 0xa000000c
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Symbolic Link
Reparse Data Length: 0x00000078
Reparse Data:
0000: 32 00 3a 00 00 00 32 00 00 00 00 00 43 00 3a 00 2.:...2.....C.:.
0010: 2f 00 50 00 72 00 6f 00 67 00 72 00 61 00 6d 00 /.P.r.o.g.r.a.m.
0020: 20 00 46 00 69 00 6c 00 65 00 73 00 2f 00 50 00 .F.i.l.e.s./.P.
0030: 79 00 74 00 68 00 6f 00 6e 00 33 00 34 00 5c 00 y.t.h.o.n.3.4.\.
0040: 3f 00 3f 00 5c 00 43 00 3a 00 5c 00 50 00 72 00 ?.?.\.C.:.\.P.r.
0050: 6f 00 67 00 72 00 61 00 6d 00 20 00 46 00 69 00 o.g.r.a.m. .F.i.
0060: 6c 00 65 00 73 00 5c 00 50 00 79 00 74 00 68 00 l.e.s.\.P.y.t.h.
0070: 6f 00 6e 00 33 00 34 00 o.n.3.4.
The print name uses forward slash, but the NT substitute name uses backslash.
In this case, GetFinalPathNameByHandle works fine ("\??" is the NT DosDevices
directory in which "C:" is a symbolic link to something like
"\Device\HarddiskVolume1"):
>>> print(os.path._getfinalpathname('Python34'))
\\?\C:\Program Files\Python34
OTOH, forward slashes aren't translated in a relative link:
>>> os.remove('Python34')
>>> os.symlink('/Program Files/Python34', 'Python34')
>>> os.system('fsutil reparsepoint query Python34')
Reparse Tag Value : 0xa000000c
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Symbolic Link
Reparse Data Length: 0x00000068
Reparse Data:
0000: 2e 00 2e 00 00 00 2e 00 01 00 00 00 2f 00 50 00 ............/.P.
0010: 72 00 6f 00 67 00 72 00 61 00 6d 00 20 00 46 00 r.o.g.r.a.m. .F.
0020: 69 00 6c 00 65 00 73 00 2f 00 50 00 79 00 74 00 i.l.e.s./.P.y.t.
0030: 68 00 6f 00 6e 00 33 00 34 00 2f 00 50 00 72 00 h.o.n.3.4./.P.r.
0040: 6f 00 67 00 72 00 61 00 6d 00 20 00 46 00 69 00 o.g.r.a.m. .F.i.
0050: 6c 00 65 00 73 00 2f 00 50 00 79 00 74 00 68 00 l.e.s./.P.y.t.h.
0060: 6f 00 6e 00 33 00 34 00 o.n.3.4.
In this case GetFinalPathNameByHandle fails because the NT executive doesn't
interpret forward slash as a path delimiter:
>>> os.path._getfinalpathname('Python34')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [WinError 123] The filename, directory name, or volume label
syntax is incorrect: 'Python34'
I think this is a bug in CreateSymbolicLink, but os.symlink should work around
it by first normalizing the target path to use os.sep.
----------
nosy: +eryksun
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue13702>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com