পাইথনে ফাইলের নাম এবং মডিউল নিয়ে বিভ্রাট

আসলে লেখাটির সঠিক শিরোনাম কি হবে, কিছুক্ষণ চিন্তা করেও যখন ঠিক করতে পারছিলাম না, ঠিক করলাম আর চিন্তা করে সময় নষ্ট না করে মূল বিষয়টা লিখে ফেলি।

আচ্ছা, একটা ফাইল ক্রিয়েট করি email.py নামে। এর ভেতর শুধুমাত্র এই দুটি লাইন লিখে সেভ করি:

1
2
3
import requests

print('I have been executed!')

এখন ফাইলটা রান করি:

python3  email.py

কি দেখলেন! নিশ্চই পাইথন এরকম বিদঘুটে ধরনের এক্সেপশন থ্রো করেছে:

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 নামে।

এখন আবার রান করি:

python3 a.py

এখন আউটপুট এসেছে এরকম:

I have been executed!

কিন্তু কেন এ বৈষম্য!

requests মডিউলটার মধ্যে email নামের আরেকটা মডিউলকে কল করা হয়েছে, যা পাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ। এখন পাইথন নিয়ম অনুযায়ী কোন মডিউল প্রথমে করেন্ট ওয়ার্কিং ডিরেক্টরিতে খোঁজে, এরপর অন্য যায়গায়। যখন আমাদের ফাইলের নাম email.py ছিল, তখন পাইথন এটাকেই স্ট্যান্ডার্ড লাইব্রেরির email মডিউল ধরে নিয়েছে। তাই ওরকম বিদঘুটে এক্সেপশন রেইজ হয়েছে। আবার রিনেম করে a.py করার পর সব ঠিক ঠাক।

পাইথনের মডিউল লুক আপ অর্ডার দেখতে ইন্টারএক্টিভ শেল চালু করে এরকম লিখুন:

>>> import sys
>>> 
>>> sys.path

সুতরাং, আমাদের পাইথন ফাইল নামকরণের সময় একটু সতর্ক থাকা লাগবে, চেষ্টা করতে হবে তা যেন অন্য কোন লাইব্রেরির নামে না হয়।

আর জটিলতা এড়ানোর জন্য সম্পূর্ণ লেখায় প্যাকেজ এবং মডিউল উভয়কেই মডিউল বলা হয়েছে। আশা করি ব্যাপারটি ক্ষমা সুন্দর দৃষ্টিতে দেখবেন। 🙂

Load Comments?