2012-03-22 15 views
7

मेरे पास एक ऐसी स्क्रिप्ट है जो वर्तमान निर्देशिका से शुरू होने और पेड़ पर जाने के लिए एक विशिष्ट फ़ाइल वाली निर्देशिका की खोज करती है (यह जानने का प्रयास करने के बारे में सोचें कि .git निर्देशिका साइट्स कहां है)।जांचें कि कोई निर्देशिका (फ़ाइल सिस्टम) रूट है

मेरे विधि इस प्रकार है:

def getDir(self,cwd): 
    path = os.path.abspath(cwd) 
    if not os.path.isdir(path): 
    raise RuntimeError("getDir should not be run on files") 
    if FILE in os.listdir(path): 
    return path 
    parent = os.path.join(path, os.path.pardir) 
    if os.access(parent, os.R_OK) and os.access(parent, os.X_OK): 
    return self.getDir(parent) 
    else 
    return None 

अब इस विधि के साथ समस्या यह है कि, अगर यह निर्देशिका नहीं मिल रहा है, यह लूप (और अंत में स्टैक-अतिप्रवाह) क्योंकि जाहिरा तौर पर / में शामिल होने और .. आप देता है / फिर से। मैंने की तुलना parent या उनके repr एस के साथ करने की कोशिश की, लेकिन यह काम नहीं किया (वे हमेशा अलग थे)। इसके लिए मेरा कामकाज रिकर्सिव विधि में गहराई का काउंटर शामिल करना और कुछ यादृच्छिक अधिकतम सीमा पर रोकना है।

मेरा प्रश्न इस प्रकार है, क्या यह जांचने के लिए एक विश्वसनीय क्रॉस-प्लेटफ़ॉर्म तरीका है कि मैं फ़ाइल सिस्टम में रूट पर पहुंच गया हूं या नहीं?

+1

मुझे पूरी तरह से यकीन नहीं है कि यह सभी प्लेटफ़ॉर्म पर विश्वसनीय है, लेकिन यदि os.path.dirname (पथ) == पथ है, तो ऐसा लगता है जैसे पथ रूट है। –

उत्तर

7

मुझे नहीं लगता कि आप पता कर सकते हैं अगर यह एक फाइल सिस्टम जड़ portably है, फिर भी मैं os.path.realpath() दोनों वर्तमान dir और अपने माता-पिता की गणना पर के लिए एक कॉल का सुझाव देते हैं चाहते हैं और अगर वे एक ही कर रहे हैं की तुलना करें - इसका मतलब है कि आप अपने पहियों को कताई कर रहे हैं और आगे बढ़ने में कोई बात नहीं है।

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

>>> os.path.realpath('/usr/bin/..') 
'/usr' 
>>> os.path.realpath('/usr/bin/../..') 
'/' 
>>> os.path.realpath('/usr/bin/../../..') 
'/' 
>>> os.path.realpath('/..') 
'/' 
16
if os.path.dirname(path) == path: 
    # you have yourself root. 
    # works on Windows and *nix paths. 
    # does NOT work on Windows shares (\\server\share) 
+1

यह विंडोज शेयरों पर काम करता है, लेकिन यह शेयर को रूट के रूप में इंगित नहीं करता है ... यह रूट के रूप में \\ सर्वर के बारे में सोचता है। वह ईमानदारी से आईएमओ को और अधिक समझ में आता है। –

+0

@nacitarsevaht आप शायद सही हैं। रूट के रूप में \\ सर्वर के बारे में सोचने से अधिक समझदारी होती है, लेकिन कम व्यावहारिक उपयोग करता है, जैसा कि "सूची डीआईआर" करने वाले सामान्य उपकरणों के माध्यम से \\ सर्वर की सामग्री को गिनती करना मुश्किल है। – ddotsenko

+0

यह उत्तर काम नहीं करता है यदि पथ में ".." तत्व हैं, जैसे @ FatalError के उत्तर में। – jmh

1

यह लिनक्स पर हमारे लिए काम करता है। विंडोज के बारे में निश्चित नहीं है, हालांकि:

def _find_root(start, stop, func=os.path.exists): 
    """Search up the start hierarchy for stop; return None at the FS root. 

    Uses func() to determine if stop exists; default is os.path.exists(). 
    """ 
    if func(os.path.join(start, stop)): 
     return start 
    else: 
     if os.path.samefile(start, os.path.dirname(start)): 
      return None 
     else: 
      return _find_root(os.path.dirname(start), stop) 

हम इस समारोह में कॉल में os.path.normpath (प्रारंभ) का उपयोग करते हैं।

संबंधित मुद्दे