2009-10-27 8 views
9

क्या पाइथन प्रोग्राम में सभी पथ ".." (मूल निर्देशिका के लिए) और/(पथ घटकों को अलग करने के लिए) का उपयोग कर सकते हैं, और अभी भी प्लेटफ़ॉर्म पर काम कर सकते हैं?यूनिक्स पथ: आधिकारिक तौर पर किसी भी मंच के लिए पायथन में काम करते हैं?

एक ओर, मैंने कभी भी दस्तावेज में ऐसा दावा नहीं देखा है (मैंने इसे याद किया होगा), और ओएस और ओएसपीएथ मॉड्यूल प्लेटफॉर्म अज्ञेय तरीके से पथों को संभालने के लिए सुविधाएं प्रदान करते हैं (os.pardir, os.path.join, ...), जो मुझे यह सोचने देता है कि वे यहां एक कारण के लिए हैं।

दूसरी ओर, आप read on StackOverflow कि "../path/to/file" सभी प्लेटफार्मों पर काम करता है ...

तो, os.pardir चाहिए कर सकते हैं, os.path.join और दोस्त हमेशा इस्तेमाल किया जा, पोर्टेबिलिटी उद्देश्यों के लिए, या यूनिक्स पथ नाम हमेशा सुरक्षित हैं (संभव चरित्र एन्कोडिंग समस्याओं तक)? या शायद "लगभग हमेशा" सुरक्षित (यानी विंडोज़, ओएस एक्स, और लिनक्स के तहत काम कर रहे हैं)?

+4

विंडोज़ पर कभी भी समस्या नहीं थी। – jldupont

उत्तर

6

"लगभग हमेशा सुरक्षित" सही है। जिन प्लेटफॉर्मों की आप परवाह करते हैं, वे शायद आज ठीक काम करते हैं और मुझे नहीं लगता कि वे जल्द ही अपने सम्मेलनों को बदल देंगे।

हालांकि पायथन बहुत पोर्टेबल है और सामान्य प्लेटफार्मों की तुलना में बहुत अधिक चलता है। os मॉड्यूल का कारण यह है कि प्लेटफॉर्म पर अलग-अलग आवश्यकताओं के बारे में चिकनी चीजों की मदद करना है।

क्या आपके पास os फ़ंक्शंस का उपयोग न करने का कोई अच्छा कारण है?

os.pardir जबकि ".." नहीं है स्वयं कुछ दस्तावेज़ीकृत है, और अजगर 1.6 से कुछ डॉक्स है os.pardir के लिए

यहाँ grep के लिए आसान हो सकता है जब मैक अभी भी

ओएस दिनचर्या सब कुछ के लिए अलग था मैक, डॉस, एनटी, या पॉज़िक्स के लिए हम किस प्रणाली पर पर हैं।

यह निर्यात: - पॉज़िक्स, एनटी, डॉस, ओएस 2, मैक, या सीई से सभी फ़ंक्शन, उदा। अनलिंक, स्टेट, इत्यादि - os.path मॉड्यूल पॉज़िक्सपाथ, एनटीपीएथ, मैकपाथ, या डोस्पाथ - ओएस नाम 'पॉज़िक्स', 'एनटी', 'डॉस', 'ओएस 2', 'मैक' है, या 'ce' - os.curdir वर्तमान निर्देशिका ('।' या ':') का प्रतिनिधित्व करने वाली एक स्ट्रिंग है - os.pardir मूल निर्देशिका ('..' या '::') का प्रतिनिधित्व करने वाली स्ट्रिंग है - os.sep (या सबसे आम) पथनाम विभाजक ('/' या ':' या '\') - os.altsep वैकल्पिक पथनाम विभाजक है (कोई नहीं या '/') - os.pathsep है घटक विभाजक $ PATH आदि में उपयोग किया जाता है - os.linesep टेक्स्ट फ़ाइलों ('' या '' या '') में लाइन विभाजक है - os.defpath निष्पादन योग्य के लिए डिफ़ॉल्ट खोज पथ है

प्रोग्राम जो 'ओएस' आयात और उपयोग करते हैं, विभिन्न प्लेटफार्मों के बीच पोर्टेबल होने का एक बेहतर मौका खड़े हैं। बेशक, उन्हें केवल सभी प्लेटफ़ॉर्म (जैसे, अनलिंक और opendir) द्वारा परिभाषित फ़ंक्शंस का उपयोग करना चाहिए, और सभी पथनाम मैनिपुलेशन os.path (उदा।, विभाजित करें और शामिल हों)।

+0

कारण मैं os.path और सह को छोड़ने के बारे में सोच रहा था। यह है कि यह os.path.join (os.pardir, ['dir1', 'dir2', 'dir3', 'फ़ाइल का उपयोग करने के बजाय "../dir1/dir2/dir3/file" लिखने के लिए सरल और स्पष्ट है। '])! – EOL

+0

@EOL मैं उन बहुत से वास्तविक कार्यक्रमों के बारे में नहीं सोच सकता जिनकी आवश्यकता है। शायद यह एक कॉन्फ़िगरेशन फ़ाइल में इस तरह के पथ को स्थानांतरित करने के लिए समझ में आता है। –

+0

@gnibbler मेरे कार्यक्रम डेटा के हजारों सेट का विश्लेषण करते हैं, और परंपरागत स्थानों में स्टोर परिणाम, जहां प्रत्येक डेटा सेट के "नाम" से निर्देशिका नामों की गणना की जाती है। लेकिन हाँ, os.path.join (os.pardir, ...) प्रत्यक्ष पथ कोडिंग के रूप में लगभग छोटा है। – EOL

1

ओएस/एक्स और लिनक्स दोनों यूनिक्स संगत हैं, इसलिए परिभाषा के अनुसार वे प्रश्न की शुरुआत में आपके द्वारा दिए गए प्रारूप का उपयोग करते हैं। विंडोज "\" के अलावा "\" को अनुमति देता है ताकि प्रोग्राम ज़ेनिक्स के साथ एक-दूसरे के संस्करण के साथ एक-दूसरे के संस्करण के साथ अंतर-परिवर्तनीय हो सकें, जो कि माइक्रोसॉफ्ट बहुत समय पहले कोशिश कर रहा था, और यह संगतता वर्तमान में आगे बढ़ी है। इस प्रकार यह भी काम करता है।

मुझे नहीं पता कि पाइथन को कितने अन्य प्लेटफॉर्म पर पोर्ट किया गया है, और मैं उनके लिए बात नहीं कर सकता।

3

पाइथन के भीतर, / का उपयोग करके हमेशा काम करेगा। आप ओएस सम्मेलन के बारे में पता करने की आवश्यकता है यदि आप एक subshell

myprog = "/path/to/my/program" 
os.system([myprog, "-n"])       # 1 
os.system([myprog, "C:/input/file/to/myprog"])  # 2 

कमान # 1 शायद अपेक्षा के अनुरूप काम करेगा में एक कमांड निष्पादित करने के लिए चाहते हैं।
कमांड # 2 काम नहीं कर सकता है अगर myprog एक विंडोज कमांड है और विंडोज फ़ाइल नाम प्राप्त करने के लिए इसके कमांड लाइन तर्कों को पार्स करने की अपेक्षा करता है।

+1

बस एक साइड नोट - प्रोग्राम्स चलाने के लिए कभी भी 'ओएस सिस्टम' का उपयोग न करें। यह एक स्ट्रिंग लेता है (आपके द्वारा उपयोग की जाने वाली सूची नहीं), और ज़रूरतमंद एक खोल का आह्वान करता है। इसके बजाए 'subprocess' मॉड्यूल का प्रयोग करें। – nosklo

3

विंडोज पथ विभाजक के रूप में / का समर्थन करता है। यूनिक्स फ़ाइल नाम और Windows फ़ाइल नामों के बीच केवल असंगतियां हैं:

  • फ़ाइल नाम में स्वीकृत वर्णों
  • विशेष नाम और
  • केस संवेदनशीलता

Windows is more restrictive in the first two accounts (यह है, यह अधिक प्रतिबंधित वर्ण है और अधिक विशेष नाम), जबकि यूनिक्स आमतौर पर मामला संवेदनशील है। यहां कुछ answers हैं जो यहां सूचीबद्ध हैं कि ये वर्ण और नाम क्या हैं। मैं देखूंगा कि मैं उन्हें पा सकता हूं या नहीं।

अब, यदि आपका विकास वातावरण पथ बनाने या छेड़छाड़ करने के लिए एक समारोह के साथ आता है, तो आपको इसका उपयोग करना चाहिए, यह एक कारण के लिए है, पता है। विशेष रूप से दिया गया है कि विंडोज और यूनिक्स की तुलना में बहुत अधिक प्लेटफार्म हैं।

अपने पहले प्रश्न का उत्तर देते हुए, हाँ ../dir/file काम करेगा, जब तक कि वे ऊपर उल्लिखित असंगतताओं में से कुछ को हिट नहीं करते।

+0

केस-संवेदनशीलता में अंतर को न भूलें। –

11

मुझे .. का उपयोग करने में कोई समस्या नहीं आई है, हालांकि os.path.abspath का उपयोग करके इसे एक पूर्ण पथ में बदलने का अच्छा विचार हो सकता है। दूसरा, मैं हमेशा os.path.join whereever का उपयोग कर अनुशंसा करता हूं।मार्गों में शामिल होने के लिए बहुत से कोने के मामले (पोर्टेबिलिटी मुद्दों से अलग) हैं, और उनके बारे में चिंता करने की ज़रूरत नहीं है। उदाहरण के लिए:

>>> '/foo/bar/' + 'qux' 
'/foo/bar/qux' 
>>> '/foo/bar' + 'qux' 
'/foo/barqux' 
>>> from os.path import join 
>>> join('/foo/bar/', 'qux') 
'/foo/bar/qux' 
>>> join('/foo/bar', 'qux') 
'/foo/bar/qux' 

आप .. का उपयोग कर यदि आप कुछ अस्पष्ट प्लेटफार्मों पर कर रहे हैं के साथ समस्या में पड़ सकते हैं, लेकिन मैं किसी भी नाम नहीं कर सकते हैं (विंडोज, * nix, और ओएस एक्स सभी का समर्थन करने वाले अंकन)।

3

यह विंडोज पर काम करता है, इसलिए यदि आप "जो भी मंच" यूनिक्स और विंडोज होने के लिए परिभाषित करते हैं, तो आप ठीक हैं।

दूसरी ओर, पायथन भी वीएमएस, आरआईएससी ओएस, और अन्य विषम प्लेटफार्मों पर चलता है जो पूरी तरह से अलग फ़ाइल नाम सम्मेलनों का उपयोग करते हैं। हालांकि, यह संभव है कि वीएमएस, अंधे पर चलने के लिए अपना आवेदन प्राप्त करने का प्रयास करना वैसे भी मूर्खतापूर्ण है - "समयपूर्व पोर्टेबिलिटी कुछ अपेक्षाकृत मामूली बुराई की जड़ है"

मुझे ओएसपीएथ फ़ंक्शंस का उपयोग करना पसंद है क्योंकि वे इरादे व्यक्त करने के लिए अच्छे हैं - केवल एक स्ट्रिंग कॉन्सटेनेशन के बजाय, जो किसी भी लाख उद्देश्यों के लिए किया जा सकता है, यह पथ कुशलता के रूप में बहुत स्पष्ट रूप से पढ़ता है।

0

जैसा कि अन्य ने कहा है, सभी मामलों में एक फॉरवर्ड स्लैश काम करेगा, लेकिन आप पथ खंडों और os.path.join() - इन्हें दर्ज करने से बेहतर हैं।

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