Для вашого заявленого сценарію немає жодної причини поєднувати realpath та abspath, оскільки os.path.realpathфактично викликає os.path.abspathперед поверненням результату (я перевірив Python 2.5 до Python 3.6).
os.path.abspath повертає абсолютний шлях, але НЕ вирішує символічні посилання в аргументі.
os.path.realpath спочатку вирішить будь-які символічні посилання у шляху, а потім поверне абсолютний шлях.
Однак, якщо ви очікуєте, що ваш шлях міститиме ~, ні abspath~ , ні realpath не вирішать домашній каталог користувача, і отриманий шлях буде недійсним . Вам потрібно буде скористатися, os.path.expanduserщоб перенести це в каталог користувача.
Для детального пояснення, ось кілька результатів, які я перевірив у Windows та Linux, в Python 3.4 та Python 2.6. Поточний каталог ( ./) - це мій домашній каталог, який виглядає так:
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()може містити..компоненти і насправді не відповідає на питання, чому ви використовуєте обидві; Відповідь Джобрада є більш точною.