2012-04-10 8 views
73

संपादित करें: Ulf Rompe की टिप्पणी के आधार पर, यह महत्वपूर्ण है कि आप "0" के बजाय "1" का उपयोग करें, अन्यथा आप sys.path तोड़ देंगे।sys.path.insert (1, पथ) के बजाय sys.path.append (पथ) का उपयोग क्यों करें?

मैं थोड़ी देर के लिए पाइथन कर रहा हूं (एक वर्ष से अधिक), और मैं हमेशा उलझन में हूं कि क्यों लोग आपको के बजाय sys.path.append() का उपयोग करने की सलाह देते हैं। मुझे प्रदर्शन करने दो।

मान लें कि मैं PyWorkbooks (जो मेरे कंप्यूटर पर स्थापित है) नामक एक मॉड्यूल पर काम कर रहा हूं, लेकिन मैं एक साथ विभिन्न मॉड्यूल पर काम कर रहा हूं (चलो पीयोजोब) जो PyWorkbooks को शामिल करता है। जैसा कि मैं PyJob पर काम कर रहा हूं, मुझे PyWorkbooks में त्रुटियां मिलती हैं जिन्हें मैं सही कर रहा हूं, इसलिए मैं एक विकास संस्करण आयात करना चाहता हूं।

दोनों पर काम करने के कई तरीके हैं (उदाहरण के लिए, मैं अपनी PyWorkbooks परियोजना को PyJob के अंदर रख सकता हूं), लेकिन कभी-कभी मुझे अभी भी पथ के साथ खेलना होगा। हालांकि, मैं उस फ़ोल्डर में sys.path.append() नहीं कर सकता जहां PyWorkbooks पर है। क्यूं कर? क्योंकि पाइथन को मेरी स्थापित PyWorkbooks पहले मिल जाएगी!

यही कारण है कि आप एक sys.path.insert क्या करना है (1, path_to_dev_pyworkbooks)

सारांश में:

sys.path.append(path_to_dev_pyworkbooks) 
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one 

या:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0** 
import PyWorkbooks # imports correct file 

यह कुछ कारण बना हुआ है अतीत में मेरे लिए hangups, और मैं वास्तव में यह पसंद करेंगे अगर हम (एक समुदाय के रूप में) sys.path.insert(1, path) की सिफारिश करना शुरू किया, जैसे कि आप मैन्युअल रूप से पथ डाल रहे हैं, मुझे लगता है कि यह कहना सुरक्षित है कि वह पथ है आप उपयोग करना चाहते हैं!

या क्या मेरे पास कुछ गलत है? यह एक सवाल है जो कभी-कभी मुझे परेशान करता है और मैं इसे खुले में चाहता था!

+1

मैंने किया है ys.path.insert (1, dev_folder) 'लेकिन यह अभी भी देव मॉड्यूल नहीं ढूंढ रहा है, और केवल स्थापित मॉड्यूल का उपयोग कर रहा है। मैं यह कैसे तय करुं? – endolith

उत्तर

40

आप एक पैकेज/मॉड्यूल के कई संस्करण है, तो आप virtualenv (जोर मेरा) का उपयोग करने की आवश्यकता है:

virtualenv पृथक अजगर वातावरण बनाने के लिए एक उपकरण है।

संबोधित मूल समस्या निर्भरताओं और संस्करणों में से एक है, और परोक्ष रूप से अनुमतियां। कल्पना कीजिए कि आपके पास एक ऐसा एप्लिकेशन है जिसके लिए लिबफू के संस्करण 1 की आवश्यकता है, लेकिन दूसरे एप्लिकेशन को संस्करण 2 की आवश्यकता है। आप इन दोनों एप्लिकेशन का उपयोग कैसे कर सकते हैं? यदि आप सबकुछ /usr/lib/python2.7/site-packages (या जो भी आपके प्लेटफ़ॉर्म का मानक स्थान है) में स्थापित करते हैं, तो ऐसी स्थिति में समाप्त होना आसान है जहां आप अनजाने में उस एप्लिकेशन को अपग्रेड करते हैं जिसे अपग्रेड नहीं किया जाना चाहिए।

या अधिक आम तौर पर, यदि आप एक एप्लिकेशन इंस्टॉल करना चाहते हैं और इसे छोड़ दें? यदि कोई एप्लिकेशन काम करता है, तो उसके पुस्तकालयों या उन पुस्तकालयों के संस्करणों में कोई भी परिवर्तन एप्लिकेशन को तोड़ सकता है।

इसके अलावा, यदि आप वैश्विक site-packages निर्देशिका में पैकेज इंस्टॉल नहीं कर सकते हैं तो क्या होगा? उदाहरण के लिए, एक साझा मेजबान पर।

इन सभी मामलों में, virtualenv आपकी मदद कर सकता है।यह एक ऐसा वातावरण बनाता है जिसमें इसकी अपनी स्थापना निर्देशिकाएं हों, जो अन्य वर्चुअलनव वातावरण के साथ पुस्तकालयों को साझा नहीं करती है (और वैकल्पिक रूप से वैश्विक रूप से स्थापित पुस्तकालयों तक पहुंच नहीं देती है)।

है यही कारण है कि लोगों पर विचार insert(0, गलत होने के लिए - यह कई वातावरण के प्रबंधन की समस्या के लिए एक अधूरी, कामचलाऊ समाधान है।

+0

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

37

तुम सच में sys.path.insert उपयोग करने के लिए की जरूरत है, sys.path छोड़ने पर विचार [0] के रूप में यह है:

sys.path.insert(1, path_to_dev_pyworkbooks) 

यह महत्वपूर्ण हो सकता है के बाद से 3 पार्टी कोड sys.path documentation अनुरूपता पर भरोसा कर सकते हैं:

कार्यक्रम स्टार्टअप, इस सूची के पहले आइटम, पथ [0], स्क्रिप्ट करने के लिए इस्तेमाल किया गया था पायथन दुभाषिया आह्वान युक्त निर्देशिका है पर प्रारंभ के रूप में।

12

आप संलग्न करने और आगे बढ़ने की अवधारणा को भ्रमित कर रहे हैं। निम्नलिखित कोड prepending है:

sys.path.insert(1,'/thePathToYourFolder/') 

यह खोज अनुक्रम है कि अपने दुभाषिया के माध्यम से जाना होगा की शुरुआत में नई जानकारी (अच्छी तरह से, दूसरा, सटीक होना करने के लिए) देता है। sys.path.append() चीजें खोज अनुक्रम के बहुत अंत में रखती है।

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

  1. python ecosystems introduction

  2. bootstrapping python virtual environments

अगर आप नीचे ले जाने का फैसला करते हैं पर्यावरण अलगाव का मार्ग आपको वर्चुअलएन्वापर में देखकर निश्चित रूप से लाभ होगा: http://www.doughellmann.com/docs/virtualenvwrapper/

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