क्यों दोनों का उपयोग करेगा, os.path.abspath और os.path.realpath?


98

कई ओपन सोर्स प्रोजेक्ट्स में, मैंने देखा है कि लोग os.path.abspath(os.path.realpath(__file__))वर्तमान फ़ाइल को पूर्ण पथ प्राप्त करने के लिए करते हैं।

हालांकि, मैं वही खोजता हूं os.path.abspath(__file__)और os.path.realpath(__file__)उसी परिणाम का उत्पादन करता हूं । os.path.abspath(os.path.realpath(__file__))थोड़ा बेमानी लगता है।

क्या कोई कारण है कि लोग उसका उपयोग कर रहे हैं?

जवाबों:


66

os.path.realpath derefences उन ऑपरेटिंग सिस्टम पर प्रतीकात्मक लिंक जो उनका समर्थन करते हैं।

os.path.abspathबस जैसी चीजों को हटा .और ..पथ से नाम की फ़ाइल (या सिमलिंक) को निर्देशिका वृक्ष की जड़ से एक पूर्ण पथ दे रही है

उदाहरण के लिए, उबंटू पर

$ ls -l
total 0
-rw-rw-r-- 1 guest guest 0 Jun 16 08:36 a
lrwxrwxrwx 1 guest guest 1 Jun 16 08:36 b -> a

$ python
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> from os.path import abspath, realpath

>>> abspath('b')
'/home/guest/play/paths/b'

>>> realpath('b')
'/home/guest/play/paths/a'

साइमलिंक में सापेक्ष पथ शामिल हो सकते हैं, इसलिए दोनों का उपयोग करने की आवश्यकता है। आंतरिक कॉल realpathएम्बेडेड ..भागों के साथ एक पथ लौटा सकता है , जो abspathतब निकालता है।


10
हालांकि यह उत्तर दो कार्यों के बीच अंतर का वर्णन करता है, यह सच नहीं है कि परिणाम realpath()में ..घटक शामिल हो सकते हैं और वास्तव में इस सवाल का जवाब नहीं देते हैं कि आप दोनों का उपयोग क्यों करेंगे; नौकरीपेशा का जवाब अधिक सटीक है।
— मीलों

पायथॉन 3.7 और विंडोज़ के लिए, रियलपैथ को सब्स्क्राइब्ड ड्राइव समझ में नहीं आता है। इसलिए एक ड्राइव की गई ड्राइव के लिए P: \ कहते हैं, सोर्स फोल्डर c: \ MyFolder \ Bla, realpath रिटर्न P: \ not c: \ MyFolder / Bla। किसी को पता है कि "वास्तविक" मार्ग कैसे प्राप्त करें?
— टोटे कार्ल्ससन

मेरे लिए, abspathयदि वर्तमान निर्देशिका सिमिलिंक है , तो भी सहानुभूति का पालन किया जाता है। इस व्यवहार को रोकने के लिए मुझे केवल यह उत्तर stackoverflow.com/questions/54665065/… मिला ।
— विक्टर सर्जेनको

107

आपके बताए गए परिदृश्य के लिए, असलीपथ और अबस्पाट को संयोजित करने का कोई कारण नहीं है, क्योंकि os.path.realpathवास्तव में os.path.abspathएक परिणाम लौटने से पहले कॉल करता है (मैंने पायथन 2.5 को पायथन 3.6 में चेक किया)।

  • os.path.abspath निरपेक्ष मार्ग लौटाता है, लेकिन अपने तर्क में सहानुभूति का समाधान नहीं करता है।
  • os.path.realpath पहले पथ में किसी भी प्रतीकात्मक लिंक को हल करेगा, और फिर निरपेक्ष पथ को लौटाएगा।

हालाँकि, यदि आप अपने पथ को शामिल करने की अपेक्षा करते हैं ~, तो न तो abspath या realpath ~उपयोगकर्ता के होम डायरेक्टरी को हल करेगा , और परिणामस्वरूप पथ अमान्य हो जाएगा । os.path.expanduserउपयोगकर्ता की निर्देशिका को हल करने के लिए आपको इसका उपयोग करना होगा ।

पूरी तरह से स्पष्टीकरण के लिए, यहां कुछ परिणाम हैं जो मैंने विंडोज और लिनक्स में सत्यापित किए हैं, पायथन 3.4 और पायथन 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'

3
अच्छा लगा। अपनी बात बनाने के लिए आपका अंतिम उदाहरण होना चाहिएos.path.realpath(os.path.expanduser('~/subdir/../data'))
— आर्थर

3
तब भी os.path.expandvars के बारे में मत भूलना अगर चर एक रास्ते में उपयोग किया जाता है
— Slavenskij

7

आम शब्दों में, यदि आप शॉर्टकट फ़ाइल का पथ प्राप्त करने का प्रयास कर रहे हैं, तो निरपेक्ष पथ शॉर्टकट स्थान में मौजूद फ़ाइल का पूरा पथ देता है , जबकि realpath फ़ाइल का मूल स्थान देता है ।

निरपेक्ष पथ, os.path.abspath (), फ़ाइल का पूरा पथ देता है जो वर्तमान कार्य निर्देशिका या आपके द्वारा उल्लिखित निर्देशिका में स्थित है।

वास्तविक पथ, os.path.realpath (), फ़ाइल का पूरा पथ देता है जिसे संदर्भित किया जा रहा है।

उदाहरण के लिए:

file = "shortcut_folder/filename"
os.path.abspath(file) = "C:/Desktop/shortcut_folder/filename"
os.path.realpath(file) = "D:/PyCharmProjects/Python1stClass/filename"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.