2012-02-10 10 views
5

मेरे पास एक पायथन प्रोग्राम है जो मैं py2exe का उपयोग कर Windows .exe पर संकलित करता हूं। Inno Setup का उपयोग करके, मैं एक विंडोज इंस्टालर बनाता हूं।विंडोज़ पर पायथन के लिए आयात() पथ आयात करने के लिए स्क्रिप्ट के काम करने वाले फ़ोल्डर को जोड़ने का सबसे अच्छा तरीका?

मेरे प्रोग्राम की प्रकृति ऐसी है कि यह प्लगइन का उपयोग करती है जिसे बाद में __import__() कथन का उपयोग करके आयात किया जाता है। ये प्लगइन्स एक 'प्लगइन्स' फ़ोल्डर में स्थित हैं, जो स्वयं ही एक उपफोल्डर के रूप में स्थित है जहां मेरे प्रोग्राम की .exe फ़ाइल रहता है।

अब, कार्यक्रम प्लगइन्स को खोजने के लिए, यह पहले बयान somwhere निम्नलिखित मेरी फाइल के शीर्ष पर था:

sys.path+= ['.'] 

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

मैं, निम्न के बयान बदलकर तय ताकि __import__() बयान भी फ़ोल्डर है जहाँ .exe स्थित है में लग रहा है (क्योंकि argv[0] निष्पादन का पूरा पथ है):

sys.path+= [os.path.dirname(sys.argv[0])] 

हालांकि, मुझे यकीन नहीं है कि मैंने सही समाधान चुना है या नहीं। विशेष रूप से, क्योंकि मेरा प्रोग्राम क्रॉस-प्लेटफॉर्म (विंडोज़, ओएसएक्स, लिनक्स) और sys.argv documentation का मतलब है argv [0] के बारे में कहता है कि 'यह ऑपरेटिंग सिस्टम निर्भर है कि यह एक पूर्ण पथनाम है या नहीं।'

क्या मुझे इसे अलग-अलग हल करना चाहिए, या मेरा दृष्टिकोण ठीक है?

उत्तर

0

कृपया मॉड्यूल के __file__ का उपयोग करें। आप

तरह

sys.path+=os.path.dirname(mymodule.__file__)

यह sys.path में अपने मॉड्यूल के मूल निर्देशिका जोड़ना होगा लिख ​​सकते हैं।

+3

हम्म, मुझे विश्वास नहीं है क्योंकि '__file__' मेरे विंडोज़ के लिए रिटर्न देता है।exe प्रोग्राम: 'सी: \ प्रोग्राम फ़ाइलें (x86) \ myprogram \ myprogram.exe \ core.pyc'। इसके लिए मुझे लौटाए गए पथ ('core.pyc' और' myprogram.exe') के दो स्तरों को पट्टी करने की आवश्यकता होगी जो ओएसएक्स, लिनक्स, या यहां तक ​​कि टर्मिनल से चलने पर भी हो सकता है। – Rabarberski

+1

फिर सबसे अच्छा समाधान है कॉन्फ़िगरेशन फ़ाइल का उल्लेख @SpencerRathbun – Nilesh

1

मैं अक्सर इस का उपयोग करें:

os.chdir(sys.argv[0].rsplit(os.sep, 1)[0]) 

कि क्रम विकास के वातावरण, जहां आप अपनी स्क्रिप्ट चलाने यह निर्देशिका है से के अनुरूप बना देता है।

+0

द्वारा किया गया है। आप अपने 'rsplit' दृष्टिकोण के बजाय 'os.path.dirname (sys.argv [0])' का उपयोग क्यों नहीं करते? 'डायरनाम' दृष्टिकोण मेरे लिए अधिक आत्म-दस्तावेज प्रतीत होता है, और शायद कुछ विशेष (क्रॉस-प्लेटफॉर्म) मामलों को पकड़ता है। – Rabarberski

3

मेरे में क्यूटी programms .exe का संकलन किया, मैं से मिलता-जुलता कोड का उपयोग कर रहा:

def executable_path(): 
    self_file = unicode(sys.argv[0], sys.getfilesystemencoding()) 
    return os.path.realpath(os.path.dirname(self_file)) 

मैं यूनिकोड का उपयोग कर रहा हूँ क्योंकि पथ गैर ascii प्रतीक हो सकता है।

sys.argv [0] यह काम कर रहा है प्रणाली निर्भर है कि क्या यह एक पूर्ण पथ-नाम या नहीं

os.path.realpath है कि समस्या का हल।

3

प्लगइन डीआईआर के पथ के साथ config फ़ाइल क्यों नहीं है? यह उपयोगकर्ता को इसे स्थानांतरित करने देता है, और आप प्रत्येक ओएस के लिए एक हो सकते हैं। निष्पादन योग्य, या हो सकता है कि लिनक्स पर कुछ अच्छी तरह से उपयोग किए गए स्थान, या/आदि, और विंडोज़ पर% होमपैथ% के साथ चिपकाएं।

+0

हां, मैं भविष्य की सुविधा के रूप में इस तरह की योजना बना रहा हूं। लेकिन इस बीच में मैं एक ही स्थान (निष्पादन योग्य के सापेक्ष) सही तरीके से काम करने का अधिक बुनियादी समाधान रखना चाहता हूं। सलाह के लिये धन्यवाद! – Rabarberski

+1

सही। खिड़कियों के नीचे प्लगइन्स शायद% APPDATA% में समाप्त हो जाना चाहिए ... –

+1

@Rabarberski यदि यह एक साधारण समाधान है, तो प्लगइन को एक्सई के समान फ़ोल्डर में कैसे रहना है? –

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