2015-07-08 27 views
11

लोड करते समय sys.path.insert (0, पथ) और sys.path (append) का उपयोग करने का प्रभाव मुझे हाल ही में एक पायथन आयात त्रुटि के साथ समस्या हो रही थी, जहां मॉड्यूल मेरे स्थानीय कंप्यूटर पर चलने पर पाया गया था लेकिन नहीं सीआई सर्वर पर मिला। मैंने इस समस्या को sys.path.append(path) को sys.path.insert(0, path) के साथ अपनी स्क्रिप्ट में स्वैप करके हल किया जहां path स्ट्रिंग मॉड्यूल स्थान है।मॉड्यूल

चूंकि यह मेरा मॉड्यूल है और एक स्थापित पैकेज नहीं है (related question), पथों का क्रम इस समस्या को ठीक क्यों करता है?

+0

संभावित डुप्लिकेट [sys.path.insert (पथ, पथ) के बजाय sys.path.append (पथ) का उपयोग क्यों करें?] (Http://stackoverflow.com/questions/10095037/why-use-sys- पथ-एपेंडपैथ-इसके-सीएस-पथ-सम्मिलित 1-पथ) – CrandellWS

उत्तर

9

क्योंकि sys.path सूची में पहली निर्देशिका में शुरू होने वाले अनुक्रमिक क्रम में निर्देशिका में पाइथन चेक करता है, जब तक कि यह .py फ़ाइल ढूंढता है, तब तक यह खोज नहीं रहा।

आदर्श रूप से, वर्तमान निर्देशिका या स्क्रिप्ट की निर्देशिका सूची में पहली बार पहला तत्व है, जब तक कि आप इसे संशोधित न करें, जैसा आपने किया था। documentation से -

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.

तो, सबसे शायद, आप मॉड्यूल आप से आयात करने की कोशिश कर रहे थे के रूप में एक ही नाम के साथ एक .py फ़ाइल वर्तमान निर्देशिका (जहाँ स्क्रिप्ट से चलाया जा रहा था) में हुआ था।

ही, ध्यान दें करने के लिए ImportError के बारे में एक बात यह है कि, मान लीजिए कि आयात त्रुटि कहते हैं - ImportError: No module named main - यह मतलब नहीं है main.py ओवरराइट है, कोई अगर उस ओवरराइट किया गया हम इसे पढ़ने का प्रयास मुद्दों कर नहीं किया जाएगा। इसके ऊपर कुछ मॉड्यूल जो एक के साथ अधिलेखित हो गया है। py या कुछ अन्य फ़ाइल।

उदाहरण -

मेरे निर्देशिका संरचना लगता है कि -

- test 
    - shared 
     - __init__.py 
     - phtest.py 
    - testmain.py 

अब testmain.py से, मैं from shared import phtest कहते हैं, यह ठीक काम करता है।

अब कहते हैं कि मैं एक shared.py test directory` में, उदाहरण के परिचय की सुविधा देता है - जब मैं testmain.py से from shared import phtest करने की कोशिश

- test 
    - shared 
     - __init__.py 
     - phtest.py 
    - testmain.py 
    - shared.py 

अब, मैं त्रुटि प्राप्त होगी -

ImportError: cannot import name 'phtest' 

जैसा कि आप ऊपर देख सकते हैं, समस्या उत्पन्न करने वाली फ़ाइल shared.py है, phtest.py नहीं है।

+0

मेरा मॉड्यूल कुछ था। मुख्य, मैंने इसे कुछ बदलने की कोशिश की। यह देखने के लिए कि यह समस्या है या नहीं, हालांकि मुझे अभी भी आयात त्रुटि है, यह मुझे बनाता है लगता है कि यह मॉड्यूल नाम/फ़ाइल टकराव नहीं था। –

+0

आयात त्रुटि क्या थी? –

+1

ट्रेसबैक की आखिरी पंक्ति "आयात त्रुटि: कोई मॉड्यूल नाम नहीं है" –

6

मैं पायथन में काफी अभी शुरुआत कर रहा हूँ और मैंने पाया आनंद का जवाब बहुत अच्छा है, लेकिन काफी मेरे लिए जटिल था, तो मैं पुन: करने की कोशिश:

1) insert और append तरीकों sys.path लिए विशिष्ट नहीं हैं और अन्य भाषाओं में के रूप में वे किसी सूची या सरणी में एक आइटम जोड़ने और:
* append(item) सूची के अंत में item जोड़ने के लिए,
* insert(n, item) सम्मिलित सूची में n वें स्थान पर item (शुरुआत में 0, 1 के बाद पहला तत्व, आदि ...)।

2) के रूप में आनंद ने कहा, अजगर पथ के क्रम में पथ के प्रत्येक निर्देशिका में खोज आयात फ़ाइलें, इसलिए:
* यदि आप कोई फ़ाइल नाम टकराव है, तो पथ के आदेश कोई प्रभाव नहीं पड़ता,
* यदि आप पथ में पहले से परिभाषित फ़ंक्शन की देखभाल करते हैं और आप अपना पथ जोड़ने के लिए append का उपयोग करते हैं, तो आपको अपना कार्य नहीं मिलेगा लेकिन पूर्वनिर्धारित एक।

लेकिन मुझे लगता है कि append का उपयोग करना बेहतर नहीं है और insert नहीं है ताकि पाइथन के मानक व्यवहार को अधिभारित न किया जा सके और अपनी फ़ाइलों और विधियों के लिए गैर-संदिग्ध नामों का उपयोग किया जा सके।

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