2010-12-07 15 views
13

के साथ वर्तमान निर्देशिका के ऊपर पाइथन ओएस मॉड्यूल खुली फ़ाइल ओएस मॉड्यूल के लिए प्रलेखन में ऐसी फ़ाइल नहीं खोलती है जो किसी उपनिर्देशिका में नहीं है या वर्तमान निर्देशिका जो स्क्रिप्ट चल रही है, पूरा रास्ता। मेरी निर्देशिका संरचना इस तरह दिखती है।सापेक्ष पथ

/home/matt/project/dir1/cgi-bin/script.py 
/home/matt/project/fileIwantToOpen.txt 

open("../../fileIwantToOpen.txt","r") 

एक फ़ाइल को त्रुटि नहीं मिली है। लेकिन अगर मैं cgi-bin निर्देशिका में एक अजगर दुभाषिया शुरू करता हूं और open("../../fileIwantToOpen.txt","r") कोशिश करता हूं तो यह काम करता है। मैं स्पष्ट पोर्टेबिलिटी कारणों के लिए पूर्ण पथ में हार्ड कोड नहीं चाहता हूं। क्या ओएस मॉड्यूल में विधियों का एक सेट है कि कर सकते हैं ऐसा करें?

+0

हम्म। यह एक अनुमति त्रुटि हो सकती है, या CGI के लिए कार्यशील निर्देशिका आपके पायथन दुभाषिया के समान नहीं हो सकती है। सटीक त्रुटि संदेश मदद कर सकता है। इसके अलावा, अपने सीजीआई में, 'os.getcwd()' प्रिंट करें और देखें कि क्या कहता है। –

+0

क्या आपकी सीजीआई स्क्रिप्ट एक क्रोट जेल में चल रही है? यदि ऐसा है, तो यह काम नहीं करेगा क्योंकि आप जेल से बच नहीं सकते हैं। –

+0

@ एडम रोसेनफील्ड संख्या। @ जेसन मैं सचमुच सीजीआई-बिन निर्देशिका में पाइथन दुभाषिया चलाता हूं, इसलिए मुझे समझ में नहीं आता कि यह उस में कैसे काम करेगा और सीजीआई-बिन निर्देशिका में चल रही स्क्रिप्ट के अंदर नहीं। –

उत्तर

33

open को दिया गया पथ वर्तमान कार्य निर्देशिका, जो निर्देशिका आप स्क्रिप्ट चलाते हैं, के सापेक्ष होना चाहिए। तो उपरोक्त उदाहरण केवल तभी काम करेगा यदि आप इसे cgi-bin निर्देशिका से चलाते हैं।

आपके पथ को स्क्रिप्ट के सापेक्ष बनाने का एक आसान समाधान होगा। एक संभावित समाधान।

from os import path 

basepath = path.dirname(__file__) 
filepath = path.abspath(path.join(basepath, "..", "..", "fileIwantToOpen.txt")) 
f = open(filepath, "r") 

इस तरह आप स्क्रिप्ट आप चला रहे हैं (basepath) की राह मिलती हैं और शामिल होने के फ़ाइल आप खोलना चाहते हैं के रिश्तेदार पथ के साथ होगा। os.path दो पथों में शामिल होने के विवरण का ख्याल रखेगा।

+0

यह आदेश मुझे ../../fileIwantToOpen.txt पथ के रूप में देता है और यह अभी भी इसे नहीं ढूंढ सकता । –

+0

यह मैंने कोशिश की और ठीक काम करने लगता है। – terminus

+0

@terminus: 'basepath = os.path.dirname (sys.argv [0])', और 'os.path.join (बेसपाथ, '..', '..', 'fileIwantToOpen.txt')'। मैं 'sys.argv [0] 'के बजाय' __file__' का भी उपयोग करूंगा। –

3

इस निर्देशिका है जहाँ स्क्रिप्ट, स्थित है यदि आप पहले से ही नहीं कर रहे हैं में आप आगे बढ़ना चाहिए:

file_path = os.path.dirname(__file__) 
if file_path != "": 
    os.chdir(file_path) 
open("../../fileIwantToOpen.txt","r") 
संबंधित मुद्दे