2016-06-16 7 views
29

एकाधिक खुली स्रोत परियोजनाओं में, मैंने लोगों को वर्तमान फ़ाइल के पूर्ण पथ प्राप्त करने के लिए os.path.abspath(os.path.realpath(__file__)) पर देखा है। हालांकि, मुझे लगता है कि os.path.abspath(__file__) और os.path.realpath(__file__) समान परिणाम उत्पन्न करते हैं। os.path.abspath(os.path.realpath(__file__)) थोड़ा अनावश्यक प्रतीत होता है। क्या इसका कोई कारण है कि लोग इसका उपयोग कर रहे हैं?os.path.abspath और os.path.realpath दोनों का उपयोग क्यों करें

उत्तर

24

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

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 हटा देता है।

+3

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

43

आपके निर्दिष्ट परिदृश्य के लिए, रीयलपैथ और abspath को गठबंधन करने का कोई कारण नहीं है, क्योंकि 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 
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' 
0

आम आदमी शब्दों में, यदि आप एक शॉर्टकट फ़ाइल का रास्ता पाने के लिए कोशिश कर रहे हैं, निरपेक्ष पथ देता है: वर्तमान निर्देशिका (./) मेरे घर निर्देशिका है, जो इस तरह दिखता है शॉर्टकट स्थान में मौजूद फ़ाइल का पूरा पथ, जबकि रीयलपाथ मूल स्थान फ़ाइल का पथ देता है।

पूर्ण पथ, 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" 
संबंधित मुद्दे