สำหรับสถานการณ์ที่คุณระบุไว้ไม่มีเหตุผลที่จะรวม 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('./')
'/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()can มี..ส่วนประกอบและไม่ได้ตอบคำถามว่าทำไมคุณถึงใช้ทั้งสองอย่าง คำตอบของ jobrad นั้นแม่นยำกว่า