Sys.path.insert (1, path) के बजाय sys.path.append (पाथ) का उपयोग क्यों करें?


88

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

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

मान लीजिए कि मैं PyWorkbooks नाम के एक मॉड्यूल पर काम कर रहा हूं (जो कि मेरे कंप्यूटर पर स्थापित है), लेकिन मैं एक साथ एक अलग मॉड्यूल पर काम कर रहा हूं (चलो PyJob कहते हैं) जो 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

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

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


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

जवाबों:


47

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

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

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

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

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

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

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


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

1
यह एक सुझाव है, लेकिन सीधे सवाल का जवाब नहीं देता (जैसे मेरे पास उपयोग न करने के मजबूत कारण हैं virtualenvऔर वास्तव में ओपी से संबंधित उत्तर की तलाश में है)
jadadba

@javadba यह आपके मामले के लिए सही हो सकता है, लेकिन इस सवाल को पूछने वाले अधिकांश लोगों का उपयोग करना चाहिए venv
एजीएफ

46

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

sys.path.insert(1, path_to_dev_pyworkbooks)

यह महत्वपूर्ण हो सकता है क्योंकि 3rd पार्टी कोड sys.path दस्तावेज़ीकरण पर निर्भर हो सकता है :

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


13

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

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

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

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

  1. अजगर पारिस्थितिकी तंत्र परिचय

  2. अजगर आभासी वातावरण बूटस्ट्रैपिंग

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


1
लिंक "अजगर पारिस्थितिक तंत्र परिचय", "बूटस्ट्रैपिंग अजगर आभासी वातावरण" सेवानिवृत्त हो गए हैं, कृपया उन्हें पुनर्जीवित करने पर विचार करें।
प्रदीप सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.