Para o seu cenário declarado, não há razão para combinar realpath e abspath, uma vez que os.path.realpath
realmente chama os.path.abspath
antes de retornar um resultado (eu verifiquei Python 2.5 para Python 3.6).
os.path.abspath
retorna o caminho absoluto, mas NÃO resolve links simbólicos em seu argumento.
os.path.realpath
primeiro resolverá quaisquer links simbólicos no caminho e, em seguida, retornará o caminho absoluto.
No entanto, se você espera que seu caminho contenha um ~
, nem abspath nem realpath serão resolvidos ~
para o diretório inicial do usuário e o caminho resultante será inválido . Você precisará usar os.path.expanduser
para resolver isso no diretório do usuário.
Para uma explicação completa, aqui estão alguns resultados que verifiquei no Windows e no Linux, no Python 3.4 e no Python 2.6. O diretório atual ( ./
) é meu diretório inicial, que se parece com isto:
myhome
|- data (symlink to /mnt/data)
|- subdir (extra directory, for verbose explanation)
# os.path.abspath returns the absolute path, but does NOT resolve symlinks in its argument
os.path.abspath('./')
'/home/myhome'
os.path.abspath('./subdir/../data')
'/home/myhome/data'
# os.path.realpath will resolve symlinks AND return an absolute path from a relative path
os.path.realpath('./')
'/home/myhome'
os.path.realpath('./subdir/../')
'/home/myhome'
os.path.realpath('./subdir/../data')
'/mnt/data'
# NEITHER abspath or realpath will resolve or remove ~.
os.path.abspath('~/data')
'/home/myhome/~/data'
os.path.realpath('~/data')
'/home/myhome/~/data'
# And the returned path will be invalid
os.path.exists(os.path.abspath('~/data'))
False
os.path.exists(os.path.realpath('~/data'))
False
# Use realpath + expanduser to resolve ~
os.path.realpath(os.path.expanduser('~/subdir/../data'))
'/mnt/data'
realpath()
pode conter..
componentes e não responde realmente à pergunta de por que você usaria ambos; a resposta de jobrad é mais precisa.