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 simon mackenzie
Recipients eryksun, paul.moore, simon mackenzie, steve.dower, tim.golden, zach.ware
Date 2021-01-19.18:48:40
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <CAGG2XGfgfcQJWjd0BML-p14RBz1390UEtwvC7VC8DmWPSJ+bfQ@mail.gmail.com>
In-reply-to <1611005121.16.0.27754348191.issue42957@roundup.psfhosted.org>
Content
For most people the expectation would be that it returns a path in the same
format as any other path. Furthermore it seems odd to change the default
behaviour after years when it worked as expected. I never heard of this
substitute path before and it does not work in some circumstances e.g.
docker does not recognise it.

Note also that os.path.realpath(os.path.readlink("v1")) still returns
\\\\?\\d:\\v1. There needs to be some way of getting to the path that
everyone actually uses.

On Mon, 18 Jan 2021 at 21:25, Eryk Sun <report@bugs.python.org> wrote:

>
> Eryk Sun <eryksun@gmail.com> added the comment:
>
> Symlinks and mountpoints (aka junctions) contain two forms of the target
> path. There's a path that's intended for display in the shell, and there's
> the actual substitute path to which the link resolves. os.readlink() was
> changed to return the substitute path because the display form is not
> mandated by filesystem protocols (it's sometimes missing, especially for
> junctions) and not reliable (e.g. the display path may be a long path or
> contain reserved names such that it's not valid without the \\?\ prefix).
> It was decided to keep the C implementation of os.readlink() simple.
> Whether to retain the \\?\ prefix was shifted to high-level functions that
> consume the result of os.readlink(), such as os.path.realpath().
>
> There was a previous issue related to this, in that the shutil module
> copies symlinks via os.readlink() and os.symlink(), which thus copies only
> the substitute path now. The issue was closed as not a bug, but had it been
> resolved with new functionality, I would have preferred to do so with a
> low-level function to copy a reparse point, not by reverting the behavior
> of os.readlink(). I also see no reason against adding an option to
> readlink() to return the display path instead of the substitute path, or to
> just remove the prefix. But I'd vote against making it the default behavior.
>
> ----------
> components: +Library (Lib)
> nosy: +eryksun
> versions: +Python 3.10
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <https://bugs.python.org/issue42957>
> _______________________________________
>
History
Date User Action Args
2021-01-19 18:48:40simon mackenziesetrecipients: + simon mackenzie, paul.moore, tim.golden, zach.ware, eryksun, steve.dower
2021-01-19 18:48:40simon mackenzielinkissue42957 messages
2021-01-19 18:48:40simon mackenziecreate