यदि Python आपके द्वारा इंस्टॉल किए गए पैकेज के बजाय आपके प्रोजेक्ट की फ़ाइल इम्पोर्ट करता है, तो सबसे पहले उस फ़ाइल की पहचान करें जिसे Python लोड कर रहा है। macOS पर, सक्रिय इंटरप्रेटर, इम्पोर्ट किए गए मॉड्यूल के पाथ (path), और उसी नाम वाली प्रोजेक्ट की किसी भी फ़ाइल या फ़ोल्डर की जाँच करें। परस्पर विरोधी (conflicting) स्थानीय फ़ाइल का नाम बदलें, यदि आवश्यक हो तो उसके पुराने बाइटकोड कैश को हटा दें, और इच्छित Python वातावरण के साथ प्रोजेक्ट चलाएं।
1. जाँचें कि कौन सा Python और मॉड्यूल उपयोग में है
Terminal में, प्रोजेक्ट फ़ोल्डर पर जाएँ और Python से मॉड्यूल के स्रोत (origin) की रिपोर्ट करने को कहें। requests को उस इम्पोर्ट नाम से बदलें जो विफल हो रहा है; उदाहरण के लिए, Pillow के रूप में इंस्टॉल किया गया पैकेज PIL के रूप में इम्पोर्ट किया जाता है।
cd "/path/to/your/project"
command -v python3
python3 -c 'import sys, importlib.util; name = "requests"; print("Python:", sys.executable); print("Module:", importlib.util.find_spec(name))'
आपकी प्रोजेक्ट डायरेक्टरी के तहत origin वाला परिणाम, जैसे कि .../requests.py, एक स्थानीय शैडोइंग (shadowing) फ़ाइल की ओर इशारा करता है। Python स्क्रिप्ट की डायरेक्टरी या वर्तमान वर्किंग डायरेक्टरी को अपने सर्च पाथ में पहले रखता है, इसलिए समान नाम वाला स्थानीय मॉड्यूल इंस्टॉल किए गए पैकेज से अधिक प्राथमिकता ले सकता है। Python का मॉड्यूल सर्च पाथ दस्तावेज़
यदि कमांड None रिपोर्ट करती है, तो वह इंटरप्रेटर उस नाम से मॉड्यूल नहीं ढूंढ पा रहा है। यदि यह site-packages में कोई स्थान दिखाता है, तो टकराव कहीं और हो सकता है: आपका ऐप एक अलग इंटरप्रेटर लॉन्च कर सकता है, इम्पोर्ट का नाम पैकेज के इंस्टॉलेशन नाम से भिन्न हो सकता है, या त्रुटि पैकेज की किसी डिपेंडेंसी (dependency) के अंदर उत्पन्न हो सकती है।
2. स्थानीय टकराव ढूंढें और नाम बदलें
प्रोजेक्ट में इम्पोर्ट के नाम पर आधारित फ़ाइल देखें, जैसे कि requests.py, या उस नाम की कोई डायरेक्टरी। सामान्य मानक-लाइब्रेरी (standard-library) नामों की भी जाँच करें जैसे कि email.py, json.py, या typing.py। फ़ाइल या डायरेक्टरी का नाम बदलकर प्रोजेक्ट-विशिष्ट नाम दें, फिर उस स्थानीय मॉड्यूल को संदर्भित करने वाले किसी भी इम्पोर्ट को अपडेट करें। इसे केवल किसी अन्य सामान्य पैकेज या मानक-लाइब्रेरी नाम में बदलने से बचें।
यदि परस्पर विरोधी फ़ाइल एक जानबूझकर बनाया गया प्रोजेक्ट मॉड्यूल है, तो इसे बनाए रखें लेकिन इसे एक विशिष्ट नाम दें और इसे अपने प्रोजेक्ट के पैकेज संरचना के माध्यम से इम्पोर्ट करें। एक प्रोजेक्ट फ़ाइल जो संयोगवश किसी थर्ड-पार्टी पैकेज का नाम साझा करती है, विशेष रूप से भ्रमित करने वाले आंशिक इम्पोर्ट या अनुपलब्ध एट्रिब्यूट्स (missing attributes) से संबंधित त्रुटियों का कारण बन सकती है।
नाम बदलने के बाद, केवल मेल खाने वाली __pycache__ डायरेक्टरी को हटा दें यदि पुरानी फ़ाइल के पास ऐसी कोई डायरेक्टरी बची हुई है। Python सामान्यतः स्रोत-फ़ाइल संशोधन समय की जाँच करता है और बाइटकोड कैश को स्वचालित रूप से रीफ़्रेश करता है; मेल खाने वाले कैश को हटाना केवल सफ़ाई का एक चरण है, नाम के टकराव को हल करने का विकल्प नहीं। Python का मॉड्यूल और बाइटकोड दस्तावेज़
3. सुनिश्चित करें कि पैकेज आपके द्वारा चलाए जा रहे Python का ही है
macOS पर, एक से अधिक Python इंस्टॉलेशन या प्रोजेक्ट वातावरण होना सामान्य बात है। sys.executable के रूप में दिखाया गया निष्पादन योग्य (executable) वही इंटरप्रेटर है जो आपके द्वारा अभी-अभी चलाए गए कमांड के पीछे है। उस इंटरप्रेटर के माध्यम से पैकेज इंस्टॉल करें ताकि pip और Python गलती से अलग-अलग वातावरणों की ओर संकेत न करें:
python3 -m pip show requests
python3 -m pip install requests
pip show के साथ पैकेज के डिस्ट्रीब्यूशन नाम और Python के साथ इसके इम्पोर्ट नाम का उपयोग करें। वे भिन्न हो सकते हैं; उदाहरण के लिए, Pillow को आमतौर पर PIL के रूप में इम्पोर्ट किया जाता है। pip show से "package not found" परिणाम का अर्थ है कि वह डिस्ट्रीब्यूशन उस कमांड द्वारा उपयोग किए जाने वाले इंटरप्रेटर के लिए इंस्टॉल नहीं है।
प्रोजेक्ट-विशिष्ट वातावरण के लिए, प्रोजेक्ट डायरेक्टरी से एक वर्चुअल वातावरण बनाएं और सक्रिय करें, फिर डिपेंडेंसी को वहां इंस्टॉल करें:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests
python -c 'import requests; print(requests.__file__)'
वातावरण के सक्रिय होने पर, python को उसके इंटरप्रेटर से समाधान (resolve) करना चाहिए। अंतिम कमांड वास्तविक लोड की गई फ़ाइल का पाथ प्रिंट करती है; जाँचें कि यह आपके प्रोजेक्ट के शीर्ष स्तर के बजाय .venv के अंतर्गत है। वर्चुअल वातावरण प्रोजेक्ट पैकेजों को अन्य वातावरणों से अलग करते हैं और python -m venv के साथ बनाए जाते हैं। Python का venv दस्तावेज़
4. पाथ ओवरराइड्स की जाँच करें और नए सिरे से चलाएं
यदि मॉड्यूल अभी भी किसी अप्रत्याशित स्थान की ओर इंगित करता है, तो Python के सर्च पाथ और किसी भी PYTHONPATH ओवरराइड का निरीक्षण करें:
python -c 'import os, sys; print("PYTHONPATH:", os.environ.get("PYTHONPATH")); print("sys.path:"); print("\n".join(sys.path))'
sys.path को PYTHONPATH और इंस्टॉलेशन-निर्भर डिफ़ॉल्ट्स का उपयोग करके इनिशियलाइज़ किया जाता है; सामान्य इनवोकेशन में, Python स्क्रिप्ट डायरेक्टरी या वर्तमान वर्किंग डायरेक्टरी को भी शुरुआत में जोड़ता है। unset PYTHONPATH के साथ वर्तमान शेल से अनपेक्षित PYTHONPATH सेटिंग हटा दें, फिर डायग्नोस्टिक को फिर से चलाएं। स्थायी सेटिंग्स के लिए, शेल स्टार्टअप फ़ाइल का निरीक्षण करें जहाँ इसे सेट किया गया था और उस एक्सपोर्ट को हटा दें या ठीक करें। Python का sys.path दस्तावेज़
फ़ाइलों का नाम बदलने या वातावरण बदलने के बाद Python प्रोसेस को पुनरारंभ (restart) करें: पहले से चल रहा इंटरप्रेटर उन मॉड्यूल को मेमोरी में बनाए रख सकता है जिन्हें उसने इम्पोर्ट किया है। फिर स्रोत (origin) जाँच को दोहराएं और कमांड या एप्लिकेशन को उसी तरह चलाएं जैसे आप सामान्य रूप से चलाते हैं। यदि स्रोत सही है लेकिन इम्पोर्ट अभी भी विफल रहता है, तो पूरा ट्रेसबैक (traceback) पढ़ें; यह नाम टकराव के बजाय किसी गुम डिपेंडेंसी या पैकेज लोड होने के दौरान उत्पन्न त्रुटि की पहचान कर सकता है।
स्रोत
6. Modules — Python Software Foundation
sys — System-specific parameters and functions — Python Software Foundation
venv — Creation of virtual environments — Python Software Foundation