Untuk skenario yang Anda nyatakan, tidak ada alasan untuk menggabungkan realpath dan abspath, karena os.path.realpathsebenarnya memanggil os.path.abspathsebelum mengembalikan hasil (saya memeriksa Python 2.5 ke Python 3.6).
os.path.abspath mengembalikan jalur absolut, tetapi TIDAK menyelesaikan symlink dalam argumennya.
os.path.realpath pertama-tama akan menyelesaikan semua tautan simbolis di jalur, dan kemudian mengembalikan jalur absolut.
Namun, jika Anda mengharapkan jalur berisi a ~, baik abspath atau realpath tidak akan menyelesaikan ~direktori beranda pengguna, dan jalur yang dihasilkan tidak valid . Anda perlu menggunakan os.path.expanduseruntuk menyelesaikan ini ke direktori pengguna.
Demi penjelasan lengkap, berikut adalah beberapa hasil yang telah saya verifikasi di Windows dan Linux, dengan Python 3.4 dan Python 2.6. Direktori saat ini ( ./) adalah direktori home saya, yang terlihat seperti ini:
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()can berisi..komponen dan tidak benar-benar menjawab pertanyaan mengapa Anda akan menggunakan keduanya; Jawaban jobrad lebih akurat.