On 17Sep2019 15:09, Hongyi Zhao <hongyi.z...@gmail.com> wrote:
See the following two methods for obtaining the file's path:

os.path.realpath(file)
or
os.path.abspath(os.path.expanduser(file))

Which is more robust?

They're probably equally robust (BTW, you need the expanduser in the realpath call as well, if your filename might start with a tilde).

realpath will resolve symlinks and get you a path that does not pass through one. abspath is more lexical and just gets you a path which may traverse a symlink. Both return a valid absolute path (provided that file is an existing file).

My inclination is often to use abspath, because it may better express the "intent" of the filename by not "undoing" the effects of symlinks.

Consider the path "~/media/foo.mp4". In my home directory, "media" may be a symlink; on at least one machine it is a symlink into our larger RAID array.

So abspath(expanduser("~/media/foo.mp4")) might expand to "/home/cameron/media/foo.mp4".

Conversely, realpath(expanduser("~/media/foo.mp4")) might expand to "/raid_volume/cameron/media/foo.mp4".

If I rearrange things, for example by moving the media directory _and_ adjusting the ~/media symlink, then the old result of abspath will still work because it traverses the symlink "media". The old result of realpath will no longer be correct.

If you just want this for your running program's internals this may not matter, but if you're recording the result somewhere then abspath might get you a more "stable" path in the above scenario.

You might ask yourself, why do you need to know the absolute path at all? A relative path is usually just fine; it isn't like it won't work unless you use it from another directory.

Cheers,
Cameron Simpson <c...@cskk.id.au>
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to