[Python-Dev] Add os.path.resolve to simplify the use of os.readlink (original) (raw)
Phil Vandry vandry at TZoNE.ORG
Thu Jun 21 15:46:12 CEST 2012
- Previous message: [Python-Dev] Add os.path.resolve to simplify the use of os.readlink
- Next message: [Python-Dev] Add os.path.resolve to simplify the use of os.readlink
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 2012-06-21 06:23, Armin Ronacher wrote:
Due to an user error on my part I was not using os.readlink correctly. Since links can be relative to their location I think it would make sense to provide an os.path.resolve helper that automatically returns the absolute path:
def resolve(filename): try: target = os.readlink(filename) except OSError as e: if e.errno == errno.EINVAL: return abspath(filename) raise return normpath(join(dirname(filename), target)) The above implementation also does not fail if an entity exists but is not a link and just returns the absolute path of the given filename in that case.
It's expensive (not to mention racy) to do this correctly, when any component of the pathname (not just the component after the last slash) might be a symlink. For example:
mkdir -p foo1/foo2 touch bar ln -s ../../bar foo1/foo2/symlink ln -s foo1/foo2 foo
Now try to resolve "foo/symlink" using your function. It produces "../bar", which doesn't exist.
Why not just work with the pathname you're given and let the kernel worry about resolving it?
-Phil
- Previous message: [Python-Dev] Add os.path.resolve to simplify the use of os.readlink
- Next message: [Python-Dev] Add os.path.resolve to simplify the use of os.readlink
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]