homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author eryksun
Recipients Andreas.Gäer, Patrick.von.Reth, brian.curtin, eryksun, lars.gustaebel
Date 2014年05月06日.23:52:17
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1399420338.75.0.937885849681.issue13702@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2014年05月06日 23:52:18eryksunsetrecipients: + eryksun, lars.gustaebel, brian.curtin, Patrick.von.Reth, Andreas.Gäer
2014年05月06日 23:52:18eryksunsetmessageid: <1399420338.75.0.937885849681.issue13702@psf.upfronthosting.co.za>
2014年05月06日 23:52:18eryksunlinkissue13702 messages
2014年05月06日 23:52:17eryksuncreate

AltStyle によって変換されたページ (->オリジナル) /