Đối với kịch bản đã nêu của bạn, không có lý do gì để kết hợp realpath và abspath, vì os.path.realpaththực sự các lệnh gọi os.path.abspathtrước khi trả về kết quả (tôi đã kiểm tra Python 2.5 đến Python 3.6).
os.path.abspath trả về đường dẫn tuyệt đối, nhưng KHÔNG giải quyết các liên kết tượng trưng trong đối số của nó.
os.path.realpath trước tiên sẽ giải quyết bất kỳ liên kết tượng trưng nào trong đường dẫn, sau đó trả về đường dẫn tuyệt đối.
Tuy nhiên, nếu bạn mong đợi con đường của bạn để chứa một ~, không phải abspath hoặc realpath sẽ giải quyết ~vào thư mục chính của người dùng, và đường dẫn kết quả sẽ là không hợp lệ . Bạn sẽ cần phải sử dụng os.path.expanduserđể giải quyết điều này vào thư mục của người dùng.
Để giải thích cặn kẽ, đây là một số kết quả mà tôi đã xác minh trong Windows và Linux, bằng Python 3.4 và Python 2.6. Thư mục hiện tại ( ./) là thư mục chính của tôi, trông giống như sau:
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()có thể chứa..các thành phần và không thực sự trả lời câu hỏi tại sao bạn lại sử dụng cả hai; câu trả lời của jobrad chính xác hơn.