আসলে লেখাটির সঠিক শিরোনাম কি হবে, কিছুক্ষণ চিন্তা করেও যখন ঠিক করতে পারছিলাম না, ঠিক করলাম আর চিন্তা করে সময় নষ্ট না করে মূল বিষয়টা লিখে ফেলি।
আচ্ছা, একটা ফাইল ক্রিয়েট করি email.py নামে। এর ভেতর শুধুমাত্র এই দুটি লাইন লিখে সেভ করি:
1 2 3 4 | import requests print('I have been executed!') |
এখন ফাইলটা রান করি:
1 | python3 email.py |
কি দেখলেন! নিশ্চই পাইথন এরকম বিদঘুটে ধরনের এক্সেপশন থ্রো করেছে:
1 2 3 4 5 6 7 8 9 10 | Traceback (most recent call last): File "email.py", line 1, in <module> import requests File "/usr/lib/python3/dist-packages/requests/__init__.py", line 58, in <module> from . import utils File "/usr/lib/python3/dist-packages/requests/utils.py", line 12, in <module> import cgi File "/usr/lib/python3.5/cgi.py", line 39, in <module> from email.parser import FeedParser ImportError: No module named 'email.parser'; 'email' is not a package |
আচ্ছা এখন ফাইলটাকে রিনেম করি a.py নামে।
এখন আবার রান করি:
1 | python3 a.py |
এখন আউটপুট এসেছে এরকম:
1 | I have been executed! |
কিন্তু কেন এ বৈষম্য!
requests মডিউলটার মধ্যে email নামের আরেকটা মডিউলকে কল করা হয়েছে, যা পাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ। এখন পাইথন নিয়ম অনুযায়ী কোন মডিউল প্রথমে করেন্ট ওয়ার্কিং ডিরেক্টরিতে খোঁজে, এরপর অন্য যায়গায়। যখন আমাদের ফাইলের নাম email.py ছিল, তখন পাইথন এটাকেই স্ট্যান্ডার্ড লাইব্রেরির email মডিউল ধরে নিয়েছে। তাই ওরকম বিদঘুটে এক্সেপশন রেইজ হয়েছে। আবার রিনেম করে a.py করার পর সব ঠিক ঠাক।
পাইথনের মডিউল লুক আপ অর্ডার দেখতে ইন্টারএক্টিভ শেল চালু করে এরকম লিখুন:
1 2 3 | >>> import sys >>> >>> sys.path |
সুতরাং, আমাদের পাইথন ফাইল নামকরণের সময় একটু সতর্ক থাকা লাগবে, চেষ্টা করতে হবে তা যেন অন্য কোন লাইব্রেরির নামে না হয়।
আর জটিলতা এড়ানোর জন্য সম্পূর্ণ লেখায় প্যাকেজ এবং মডিউল উভয়কেই মডিউল বলা হয়েছে। আশা করি ব্যাপারটি ক্ষমা সুন্দর দৃষ্টিতে দেখবেন। 🙂
Spin up your first SSD cloud server on DigitalOcean with $10 free credit!