2010-03-29 16 views
6

पर्ल में, FindBin मॉड्यूल का उपयोग मूल स्क्रिप्ट की निर्देशिका का पता लगाने के लिए किया जाता है। पाइथन में इस निर्देशिका को पाने के लिए कैननिक तरीका क्या है?पर्ल के FindBin के पाइथन समकक्ष क्या है?

विकल्पों मैंने देखा है में से कुछ: अगर वहाँ

  • os.path.dirname(os.path.realpath(sys.argv[0]))
  • os.path.abspath(os.path.dirname(sys.argv[0]))
  • os.path.abspath(os.path.dirname(__file__))
+0

FindBin का उपयोग न करें: http://www.perlmonks.org/?node_id=41213 – runrig

+4

पर्ल्मोक्स शिकायत पुरानी और अप्रचलित है। FindBin बनाया गया था क्योंकि,/proc/pID/exe के आगमन से पहले, वर्तमान निष्पादन योग्य के पथ को खोजने के लिए हेरिस्टिक की आवश्यकता थी। शिकायतकर्ता के पास एक ह्युरिस्टिक था, जो अक्सर काम करता था लेकिन हमेशा काम नहीं करता था। अंत में, यह बताया गया था कि FindBin की हेरिस्टिक में सुधार हुआ है। अब, यह उपलब्ध होने पर/proc/pID/exe का उपयोग करता है, और ऐसे सिस्टम पर यह उस परम चर्चा में शिकायत से अधिक विश्वसनीय है। –

+0

मुझे अभी भी उपयोगी होने के बारे में मेरी 3 साल + पुरानी टिप्पणी में शामिल करने दें - उपयोगी है कि पर्ल फाइंडबिन अब कोर पर्ल वितरण में है: आईएमएचओ फाइंडबिन से भी अधिक उपयोगी है सीपीएएन की डिर :: सेल्फ, जो एक छद्म-निरंतर __DIR__ बनाता है उस निर्देशिका में फैली हुई है जिसमें आपकी स्रोत फ़ाइल है (पूर्ण)। FindBin केवल निष्पादन योग्य के लिए काम करता है; __DIR__ किसी भी मॉड्यूल के लिए काम करता है। –

उत्तर

6

मैं बहुत बार अजगर का उपयोग नहीं करते तो मैं नहीं जानता कि पैकेज FindBin लेकिन

import os 
import sys 
bindir = os.path.abspath(os.path.dirname(sys.argv[0])) 

काम करना चाहिए।

+0

मुझे लगता है कि पर्ल में $ 0 के बजाय 'FindBin' का उपयोग करना स्क्रिप्ट का पता लगाने के लिए है, यहां तक ​​कि इसे एक लिंक के माध्यम से एक्सेस किया जाता है। sys.argv [0] लगभग $ 0 के समान है, और लिंक के लिए काम नहीं करेगा। –

+0

क्षमा करें, मैं गलत था। दोनों लिंक के लिए काम नहीं करेंगे। –

+0

पर्ल फाइंडबिन और डिर :: सेल्फ _ _DIR_ _ के सिद्धांतों में से एक स्क्रिप्ट या मॉड्यूल के सापेक्ष मॉड्यूल लोड करना है। जैसा कि "lib _ __DIR_ _ का उपयोग करें" या "lib $ FindBin :: RealBin का उपयोग करें" जहां तक ​​मैं कह सकता हूं, पाइथन के लिए स्वीकृत उत्तर इस तरह से उपयोग नहीं किया जा सकता है। // स्वीकार्य पायथन उत्तर अपेक्षाकृत निष्पादन योग्य बनाने के लिए उपयोग किया जा सकता है। –

12

आप इस कोशिश कर सकते हैं:

import os 
bindir = os.path.abspath(os.path.dirname(__file__)) 

आप वर्तमान फ़ाइल की निर्देशिका के निरपेक्ष पथ दे देंगे कि।

0

पिछले उत्तरों के अद्यतन करने के लिए अजगर 3.4+ के साथ, अब आप कर सकते हैं:

import pathlib 
bindir = pathlib.Path(__file__).resolve().parent 

कौन सा आप एक ही है, सिवाय इसके कि आप एक पथ उद्देश्य यह है कि जिस तरह से अधिक काम करने के लिए अच्छा है मिल जाएगा दे देंगे साथ में।

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