Для вашего заявленного сценария нет причин комбинировать realpath и abspath, поскольку os.path.realpathфактически вызывает os.path.abspathперед возвратом результата (я проверил Python 2.5 на Python 3.6).
os.path.abspath возвращает абсолютный путь, но НЕ разрешает символические ссылки в своем аргументе.
os.path.realpath сначала разрешит все символические ссылки в пути, а затем вернет абсолютный путь.
Однако, если вы ожидаете, что ваш путь будет содержать a ~, ни 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('./')
'/home/myhome'
os.path.abspath('./subdir/../data')
'/home/myhome/data'
os.path.realpath('./')
'/home/myhome'
os.path.realpath('./subdir/../')
'/home/myhome'
os.path.realpath('./subdir/../data')
'/mnt/data'
os.path.abspath('~/data')
'/home/myhome/~/data'
os.path.realpath('~/data')
'/home/myhome/~/data'
os.path.exists(os.path.abspath('~/data'))
False
os.path.exists(os.path.realpath('~/data'))
False
os.path.realpath(os.path.expanduser('~/subdir/../data'))
'/mnt/data'
realpath()может содержать..компоненты, и на самом деле не отвечает на вопрос, почему вы должны использовать обе; Ответ Джобрада более точен.