[Python-ideas] Three ways of paths canonization
Brett Cannon
brett at python.org
Thu Sep 8 17:28:22 EDT 2016
On Thu, 8 Sep 2016 at 09:46 Guido van Rossum <guido at python.org> wrote:
> I would prefer it if Path.resolve() resolved symlinks until it hits
> something that doesn't exist and then just keep the rest of the path
> unchanged. I think this is the equivalent of -m in the mentioned
> utility (which I had never heard of).
>
> It looks like os.path.realpath() already works this way.
>
> Steve Dower just mentioned to me that the Windows version of
> Path.resolve() uses a Windows API that opens the file and then asks
> the system for the pathname -- that doesn't work if the file doesn't
> exist, so it should be fixed to back off and try the same thing on the
> parent, etc.
>
> We should treat these things as bugs to fix before 3.6 (in 3.6b1 if
> possible) and make pathlib non-provisional as of 3.6.0.Probably these
> things should be fixed in 3.5.3 as well, since pathlib is still
> provisional there.
>
http://bugs.python.org/issue28031 to track this.
-Brett
>
> --Guido
>
> On Wed, Sep 7, 2016 at 7:47 AM, Stephen J. Turnbull
> <turnbull.stephen.fw at u.tsukuba.ac.jp> wrote:
> > Serhiy Storchaka writes:
> >
> > > The readlink utility from GNU coreutils has three mode for resolving
> > > file path:
> > >
> > > -f, --canonicalize
> > > canonicalize by following every symlink in every
> > > component of the given name recursively; all but the last component
> must
> > > exist
> > >
> > > -e, --canonicalize-existing
> > > canonicalize by following every symlink in every
> > > component of the given name recursively, all components must exist
> > >
> > > -m, --canonicalize-missing
> > > canonicalize by following every symlink in every
> > > component of the given name recursively, without requirements on
> > > components existence
> >
> > In Mac OS X (and I suppose other BSDs), realpath(3) implements -e.
> > glibc does none of these, instead:
> >
> > GNU extensions
> > If the call fails with either EACCES or ENOENT and
> > resolved_path is not NULL, then the prefix of path that is not
> > readable or does not exist is returned in resolved_path.
> >
> > I suppose this nonstandard behavior is controlled by a #define, but
> > the Linux manpage doesn't specify it.
> >
> > > Current behavior of posixpath.realpath() is matches (besides one minor
> > > detail) to `readlink -m`. The behavior of Path.resolve() matches
> > > `readlink -e`.
> >
> > This looks like a bug in posixpath, while Path.resolve follows POSIX.
> > http://pubs.opengroup.org/onlinepubs/009695399/functions/realpath.html
> > sez:
> >
> > RETURN VALUE
> >
> > Upon successful completion, realpath() shall return a pointer to
> > the resolved name. Otherwise, realpath() shall return a null
> > pointer and set errno to indicate the error, and the contents of
> > the buffer pointed to by resolved_name are undefined.
> >
> > ERRORS
> >
> > The realpath() function shall fail if:
> >
> > [...]
> > [ENOENT] A component of file_name does not name an existing file or
> > file_name points to an empty string.
> > [ENOTDIR] A component of the path prefix is not a directory.
> >
> > which corresponds to -e.
> >
> > > I have proposed a patch that adds three-state optional parameter to
> > > posixpath.realpath() and I'm going to provide similar patch for
> > > Path.resolve(). But I'm not sure this is good API. Are there better
> > > variants?
> >
> > Said parameter will almost always be a constant. Usually in those
> > cases Python prefers to use different functions. Eg,
> >
> > posixpath.realpath -e
> > posixpath.realpath_require_prefix -f
> > posixpath.realpath_allow_missing -m
> > posixpath.realpath_gnuext GNU extension
> >
> > _______________________________________________
> > Python-ideas mailing list
> > Python-ideas at python.org
> > https://mail.python.org/mailman/listinfo/python-ideas
> > Code of Conduct: http://python.org/psf/codeofconduct/
>
>
>
> --
> --Guido van Rossum (python.org/~guido)
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160908/a86f7762/attachment.html>
More information about the Python-ideas
mailing list