যদি পাইথন আপনার ইনস্টল করা প্যাকেজের পরিবর্তে আপনার প্রজেক্ট থেকে কোনো ফাইল ইমপোর্ট করে, তবে প্রথমে পাইথন কোন ফাইলটি লোড করছে তা শনাক্ত করুন। macOS-এ, সক্রিয় ইন্টারপ্রেটার, ইমপোর্ট করা মডিউলের পাথ এবং একই নামের যেকোনো প্রজেক্ট ফাইল বা ফোল্ডার পরীক্ষা করুন। দ্বন্দ্ব তৈরি করা লোকাল ফাইলটির নাম পরিবর্তন করুন, প্রয়োজনে এর পুরনো বাইটকোট ক্যাশ মুছে ফেলুন এবং উদ্দিষ্ট পাইথন এনভায়রনমেন্ট দিয়ে প্রজেক্টটি চালান।

১. কোন পাইথন এবং মডিউল ব্যবহার করা হচ্ছে তা পরীক্ষা করুন

টার্মিনালে, প্রজেক্ট ফোল্ডারে যান এবং মডিউলটির উৎস রিপোর্ট করতে পাইথনকে নির্দেশ দিন। ব্যর্থ হওয়া ইমপোর্টের নাম দিয়ে 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, একটি লোকাল শ্যাডোয়িং ফাইলের দিকে নির্দেশ করে। পাইথন তার সার্চ পাথের শুরুর দিকে স্ক্রিপ্টের ডিরেক্টরি বা বর্তমান ওয়ার্কিং ডিরেক্টরিকে রাখে, তাই একই নামের একটি লোকাল মডিউল ইনস্টল করা প্যাকেজের চেয়ে অগ্রাধিকার পেতে পারে। পাইথনের মডিউল সার্চ পাথ ডকুমেন্টেশন

যদি কমান্ডটি None রিপোর্ট করে, তবে সেই ইন্টারপ্রেটার ওই নামে মডিউলটি খুঁজে পাচ্ছে না। যদি এটি site-packages-এর কোনো অবস্থান দেখায়, তবে কলিশনটি অন্য কোথাও হতে পারে: আপনার অ্যাপ হয়তো ভিন্ন কোনো ইন্টারপ্রেটার চালু করছে, ইমপোর্টের নাম প্যাকেজটির ইনস্টলেশন নামের চেয়ে আলাদা হতে পারে, অথবা কোনো প্যাকেজ ডিপেন্ডেন্সির ভেতরে ত্রুটি দেখা দিতে পারে।

২. লোকাল কনফ্লিক্ট খুঁজুন এবং নাম পরিবর্তন করুন

প্রজেক্টে ইমপোর্টের নামানুসারে থাকা কোনো ফাইল, যেমন requests.py, অথবা ওই নামের কোনো ডিরেক্টরি খুঁজুন। এছাড়াও email.py, json.py, বা typing.py-এর মতো সাধারণ স্ট্যান্ডার্ড-লাইব্রেরির নামগুলোও পরীক্ষা করুন। ফাইল বা ডিরেক্টরিটির নাম পরিবর্তন করে প্রজেক্ট-নির্দিষ্ট কোনো নাম দিন, তারপর সেই লোকাল মডিউলটিকে নির্দেশ করা যেকোনো ইমপোর্ট আপডেট করুন। কেবল অন্য কোনো সাধারণ প্যাকেজ বা স্ট্যান্ডার্ড-লাইব্রেরির নামে পরিবর্তন করা এড়িয়ে চলুন।

দ্বন্দ্ব তৈরি করা ফাইলটি যদি প্রজেক্টের ইচ্ছাকৃত কোনো মডিউল হয়, তবে সেটি রাখুন কিন্তু এটিকে একটি স্বতন্ত্র নাম দিন এবং আপনার প্রজেক্টের প্যাকেজ কাঠামোর মাধ্যমে এটি ইমপোর্ট করুন। কোনো প্রজেক্ট ফাইলের নাম যদি ঘটনাচক্রে কোনো থার্ড-পার্টি প্যাকেজের নামের সাথে মিলে যায়, তবে বিভ্রান্তিকর আংশিক ইমপোর্ট বা অনুপস্থিত অ্যাট্রিবিউট সংক্রান্ত ত্রুটি ঘটার সম্ভাবনা প্রবল থাকে।

নাম পরিবর্তনের পর, পুরনো ফাইলটির পাশে যদি কোনো __pycache__ ডিরেক্টরি অবশিষ্ট থাকে, তবে কেবল সংশ্লিষ্ট ডিরেক্টরিটি মুছে ফেলুন। পাইথন সাধারণত সোর্স-ফাইলের পরিবর্তনের সময় যাচাই করে এবং স্বয়ংক্রিয়ভাবে বাইটকোড ক্যাশ রিফ্রেশ করে; সংশ্লিষ্ট ক্যাশ ডিলিট করা শুধুই একটি পরিচ্ছন্নতা ধাপ, নামের দ্বন্দ্ব সমাধানের বিকল্প নয়। পাইথনের মডিউল এবং বাইটকোড ডকুমেন্টেশন

৩. প্যাকেজটি আপনার চালানো পাইথনের আওতাধীন কিনা তা নিশ্চিত করুন

macOS-এ একাধিক পাইথন ইনস্টলেশন বা প্রজেক্ট এনভায়রনমেন্ট থাকা খুবই স্বাভাবিক। sys.executable হিসেবে প্রদর্শিত এক্সিকিউটেবলটি হলো আপনার সদ্য চালানো কমান্ডের পেছনের ইন্টারপ্রেটার। সেই ইন্টারপ্রেটারের মাধ্যমে প্যাকেজগুলো ইনস্টল করুন যাতে pip এবং পাইথন ভুলবশত ভিন্ন ভিন্ন এনভায়রনমেন্টের দিকে নির্দেশ না করে:

python3 -m pip show requests
python3 -m pip install requests

pip show-এর সাথে প্যাকেজটির ডিস্ট্রিবিউশন নাম এবং পাইথনের সাথে এর ইমপোর্ট নাম ব্যবহার করুন। এগুলো ভিন্ন হতে পারে; উদাহরণস্বরূপ, Pillow সাধারণত PIL হিসেবে ইমপোর্ট করা হয়। pip show থেকে “package not found” ফলাফলের অর্থ হলো সেই কমান্ড দ্বারা ব্যবহৃত ইন্টারপ্রেটারের জন্য ওই ডিস্ট্রিবিউশনটি ইনস্টল করা নেই।

প্রজেক্ট-নির্দিষ্ট কোনো এনভায়রনমেন্টের জন্য, প্রজেক্ট ডিরেক্টরি থেকে একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি ও সক্রিয় (activate) করুন, তারপর সেখানে ডিপেন্ডেন্সি ইনস্টল করুন:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests
python -c 'import requests; print(requests.__file__)'

এনভায়রনমেন্ট সক্রিয় থাকা অবস্থায়, python তার নিজস্ব ইন্টারপ্রেটারকেই নির্দেশ করা উচিত। শেষ কমান্ডটি লোড হওয়া ফাইলের প্রকৃত পাথ প্রিন্ট করে; এটি আপনার প্রজেক্টের শীর্ষ স্তরের পরিবর্তে .venv-এর অধীনে রয়েছে কিনা তা পরীক্ষা করে দেখুন। ভার্চুয়াল এনভায়রনমেন্টগুলো প্রজেক্টের প্যাকেজগুলোকে অন্যান্য এনভায়রনমেন্ট থেকে আলাদা রাখে এবং এগুলো python -m venv দিয়ে তৈরি করা হয়। পাইথনের venv ডকুমেন্টেশন

৪. পাথ ওভাররাইড পরীক্ষা করুন এবং নতুন করে চালান

মডিউলটি যদি এখনও কোনো অপ্রত্যাশিত অবস্থানে নির্দেশিত হয়, তবে পাইথনের সার্চ পাথ এবং যেকোনো PYTHONPATH ওভাররাইড পর্যবেক্ষণ করুন:

python -c 'import os, sys; print("PYTHONPATH:", os.environ.get("PYTHONPATH")); print("sys.path:"); print("\n".join(sys.path))'

PYTHONPATH এবং ইনস্টলেশন-নির্ভর ডিফল্ট মানগুলো ব্যবহার করে sys.path শুরু করা হয়; সাধারণ ব্যবহারে, পাইথন স্ক্রিপ্ট ডিরেক্টরি বা বর্তমান ওয়ার্কিং ডিরেক্টরিকেও এর শুরুতে যোগ করে। unset PYTHONPATH দিয়ে বর্তমান শেল থেকে অনাকাঙ্ক্ষিত PYTHONPATH সেটিংসটি সরিয়ে ফেলুন, তারপর ডায়াগনস্টিকটি পুনরায় চালান। স্থায়ী সেটিংসের জন্য, যে শেল স্টার্টআপ ফাইলে এটি সেট করা হয়েছিল তা পরীক্ষা করুন এবং সেই এক্সপোর্টটি মুছে ফেলুন বা সংশোধন করুন। পাইথনের sys.path ডকুমেন্টেশন

ফাইলের নাম পরিবর্তন করার বা এনভায়রনমেন্ট বদলানোর পর পাইথন প্রসেসটি পুনরায় চালু করুন: আগে থেকেই চলমান কোনো ইন্টারপ্রেটার তার ইমপোর্ট করা মডিউলগুলো মেমরিতে ধরে রাখতে পারে। এরপর উৎসের সত্যতা যাচাই করার কাজটি আবার করুন এবং কমান্ড বা অ্যাপ্লিকেশনটি স্বাভাবিক নিয়মে চালান। যদি উৎস সঠিক থাকে কিন্তু তবুও ইমপোর্ট ব্যর্থ হয়, তবে সম্পূর্ণ ট্রেসব্যাকটি পড়ুন; নামের দ্বন্দ্বের চেয়ে বরং কোনো অনুপস্থিত ডিপেন্ডেন্সি বা প্যাকেজটি লোড হওয়ার সময় ঘটা কোনো ত্রুটি এর কারণ হতে পারে।

তথ্যসূত্র