Message218029
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. |
|
Date |
User |
Action |
Args |
2014-05-06 23:52:18 | eryksun | set | recipients:
+ eryksun, lars.gustaebel, brian.curtin, Patrick.von.Reth, Andreas.Gäer |
2014-05-06 23:52:18 | eryksun | set | messageid: <1399420338.75.0.937885849681.issue13702@psf.upfronthosting.co.za> |
2014-05-06 23:52:18 | eryksun | link | issue13702 messages |
2014-05-06 23:52:17 | eryksun | create | |
|