পাইথন মডিউল এবং পাইথন প্যাকেজের মধ্যে পার্থক্য কী?
আরও দেখুন: "প্যাকেজ" এবং "মডিউল" (অন্যান্য ভাষার জন্য) মধ্যে পার্থক্য কী?
__init__.py
ফাইল থাকতে হবে।
from plumbum.cmd import ls
বাস্তবায়ন
__init__.py
পাইথন মডিউল এবং পাইথন প্যাকেজের মধ্যে পার্থক্য কী?
আরও দেখুন: "প্যাকেজ" এবং "মডিউল" (অন্যান্য ভাষার জন্য) মধ্যে পার্থক্য কী?
__init__.py
ফাইল থাকতে হবে।
from plumbum.cmd import ls
বাস্তবায়ন
__init__.py
উত্তর:
মডিউল হ'ল একক ফাইল (বা ফাইল) যা এক আমদানির অধীনে আমদানি করা হয় এবং ব্যবহৃত হয়। যেমন
import my_module
একটি প্যাকেজ হ'ল ডিরেক্টরিগুলির মডিউলগুলির সংকলন যা প্যাকেজ স্তরক্রম দেয়।
from my_package.timing.danger.internets import function_of_love
__path__
বৈশিষ্ট্য সহ কেবলমাত্র একটি মডিউল ।
__init__.py
ফাইলের সংমিশ্রণে গঠিত হয় । এগুলি মডিউল যা অন্যান্য মডিউল থাকতে পারে।
__path__
অ্যাট্রিবিউটযুক্ত পাইথন মডিউল ।
যে কোনও পাইথন ফাইল হ'ল একটি মডিউল , এর নামটি .py
এক্সটেনশন ছাড়াই ফাইলের বেস নাম । একটি প্যাকেজ পাইথন মডিউলগুলির সংকলন: মডিউলটি যখন একটি একক পাইথন ফাইল হয়, একটি প্যাকেজ পাইথন মডিউলগুলির একটি অতিরিক্ত __init__.py
ফাইল যুক্ত একটি ডিরেক্টরি যা একটি ডিরেক্টরি থেকে একটি প্যাকেজকে পৃথক করে যা কেবল পাইথন স্ক্রিপ্টগুলির একটি গুচ্ছ ধারণ করে। প্যাকেজগুলি কোনও গভীরতায় বাসা বাঁধতে পারে, তবে সংশ্লিষ্ট ডিরেক্টরিতে তাদের নিজস্ব __init__.py
ফাইল থাকে।
মডিউল এবং প্যাকেজের মধ্যে পার্থক্যটি কেবল ফাইল সিস্টেম স্তরে ধারণ করে। আপনি যখন কোনও মডিউল বা কোনও প্যাকেজ আমদানি করেন, পাইথন দ্বারা নির্মিত সম্পর্কিত অবজেক্টটি সর্বদা টাইপ থাকে module
। উল্লেখ্য, যখন আপনি একটি প্যাকেজ আমদানি করতে, শুধুমাত্র ভেরিয়েবল / ফাংশন / ক্লাস __init__.py
এমন প্যাকেজের ফাইল সরাসরি দৃশ্যমান না উপ-প্যাকেজ অথবা মডিউল। উদাহরণস্বরূপ, xml
পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে প্যাকেজটি বিবেচনা করুন : এর xml
ডিরেক্টরিতে একটি __init__.py
ফাইল এবং চারটি উপ-ডিরেক্টরি রয়েছে; উপ ডিরেক্টরিতে etree
একটি __init__.py
ফাইল এবং অন্যদের মধ্যে একটি ElementTree.py
ফাইল রয়েছে। আপনি যখন ইন্টারঅ্যাকটিভ প্যাকেজ / মডিউলগুলি আমদানি করার চেষ্টা করবেন তখন কী ঘটে তা দেখুন:
>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>
পাইথন-এ বিল্ট-ইন মডিউলগুলিও রয়েছে, যেমন sys
, সিতে লেখা রয়েছে, তবে আমি মনে করি না যে আপনি আপনার প্রশ্নে সেগুলি বিবেচনা করেছেন।
module
। আমি একটি ডিবাগার লেখার প্রক্রিয়ায় আছি এবং চিন্তিত ছিলাম যে আমার ডিবাগারটি আমার প্যাকেজগুলি হ'ল তা ভুল বলেছিল module
।
import
বিবৃতি দিয়ে নয়, মডিউল হিসাবে আমদানি করা যায় , কারণ পাইথন শনাক্তকারীগুলিতে ড্যাশগুলির অনুমতি নেই। importlib.import_module()
পরিবর্তে ব্যবহার করুন।
থেকে পাইথন শব্দকোষ :
এটি মনে রাখা গুরুত্বপূর্ণ যে সমস্ত প্যাকেজ মডিউল, তবে সমস্ত মডিউল প্যাকেজ নয় are অথবা অন্যভাবে বলতে গেলে প্যাকেজগুলি কেবলমাত্র একটি বিশেষ ধরণের মডিউল। বিশেষত, যে কোনও মডিউলটিতে একটি
__path__
বৈশিষ্ট্য রয়েছে তাকে প্যাকেজ হিসাবে বিবেচনা করা হয়।
নামে ড্যাশযুক্ত পাইথন ফাইলগুলি my-file.py
, সাধারণ import
বিবৃতি দিয়ে আমদানি করা যায় না । কোড-ওয়াইজ, import my-file
একই রকম import my - file
যা ব্যতিক্রম বাড়িয়ে তুলবে। এই জাতীয় ফাইলগুলি স্ক্রিপ্ট হিসাবে আরও বেশি বৈশিষ্ট্যযুক্ত যেখানে আমদানিযোগ্য ফাইলগুলি মডিউল ।
প্রথমে মনে রাখবেন যে এর সঠিক সংজ্ঞা অনুসারে মডিউলটি পাইথন ইন্টারপ্রেটারের স্মৃতিতে একটি বস্তু যা প্রায়শই ডিস্ক থেকে এক বা একাধিক ফাইল পড়ে তৈরি করা হয়। যদিও আমরা অনানুষ্ঠানিকভাবে একটি ডিস্ক ফাইল যেমন a/b/c.py
"মডিউল" বলতে পারি, sys.path
এটি মডিউল অবজেক্ট তৈরির জন্য অন্যান্য বেশ কয়েকটি উত্সের (যেমন ) তথ্যের সাথে একত্রিত না হওয়া অবধি এটি এক হয়ে যায় না ।
(দ্রষ্টব্য, উদাহরণস্বরূপ, পৃথক নামের দুটি মডিউল একই ফাইল থেকে লোড করা যেতে পারে sys.path
এবং অন্যান্য সেটিংসের উপর নির্ভর করে the অনুবাদক-এর python -m my.module
পরে এটিই ঘটে থাকে import my.module
; দুটি মডিউল অবজেক্ট থাকবে __main__
এবং my.module
উভয়ই তৈরি করা হবে) ডিস্কে একই ফাইল থেকে my/module.py
।)
একটি প্যাকেজ এমন একটি মডিউল যা সাবমডিউলগুলি থাকতে পারে (সাবপ্যাকেজ সহ)। সমস্ত মডিউল এটি করতে পারে না। উদাহরণ হিসাবে, একটি ছোট মডিউল স্তরক্রম তৈরি করুন:
$ mkdir -p a/b
$ touch a/b/c.py
নিশ্চিত করুন যে এর অধীনে অন্য কোনও ফাইল নেই a
। পাইথন ৩.৪ বা তার পরের দোভাষী (উদাহরণস্বরূপ, সহ python3 -i
) শুরু করুন এবং নীচের বিবৃতিগুলির ফলাফল পরীক্ষা করুন:
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ⇒ <module 'a.b' (namespace)>
a.b.c ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>
মডিউল a
এবং হ'ল a.b
প্যাকেজ (আসলে, একটি নির্দিষ্ট ধরণের প্যাকেজ যাকে "নেমস্পেস প্যাকেজ" বলা হয়, যদিও আমরা এখানে সে সম্পর্কে উদ্বিগ্ন নই)। তবে মডিউল a.b.c
কোনও প্যাকেজ নয়। a/b.py
উপরের ডিরেক্টরি কাঠামোয় এবং একটি নতুন দোভাষী শুরু করে আমরা অন্য ফাইল যুক্ত করে এটি প্রদর্শন করতে পারি :
import a.b.c
⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a ⇒ <module 'a' (namespace)>
a.__path__ ⇒ _NamespacePath(['/.../a'])
a.b ⇒ <module 'a.b' from '/home/cjs/tmp/a/b.py'>
a.b.__path__ ⇒ AttributeError: 'module' object has no attribute '__path__'
পাইথন নিশ্চিত করে যে চাইল্ড মডিউলটি লোড হওয়ার আগে সমস্ত প্যারেন্ট মডিউলগুলি লোড হবে are উপরে এটি আবিষ্কার করে যে a/
এটি একটি ডিরেক্টরি, এবং তাই একটি নেমস্পেস প্যাকেজ তৈরি করে a
এবং এটি a/b.py
একটি পাইথন উত্স ফাইল যা এটি লোড করে এবং একটি (প্যাকেজবিহীন) মডিউল তৈরি করতে ব্যবহার করে a.b
। এই মুহুর্তে আপনার কোনও মডিউল থাকতে পারে না a.b.c
কারণa.b
এটি প্যাকেজ নয় এবং সুতরাং সাবমডিউল থাকতে পারে না।
আপনি এখানে দেখতে পারেন যে প্যাকেজ মডিউলটির a
একটি __path__
বৈশিষ্ট্য রয়েছে (প্যাকেজগুলির অবশ্যই এটি থাকতে পারে) তবে প্যাকেজবিহীন মডিউলটি a.b
তা দেয় না।
দেরিতে উত্তর, অন্য একটি সংজ্ঞা:
একটি প্যাকেজটি আমদানি করা শীর্ষ-সত্তা দ্বারা প্রতিনিধিত্ব করা হয় যা হয় স্ব-অন্তর্ভুক্ত মডিউল হতে পারে, বা
__init__.py
উপ ডিরেক্টরি কাঠামোর মধ্যে মডিউলগুলির সেট থেকে শীর্ষ-সত্তা হিসাবে বিশেষ মডিউল।
সুতরাং শারীরিকভাবে একটি প্যাকেজ হল একটি বিতরণ ইউনিট, যা এক বা একাধিক মডিউল সরবরাহ করে।
__init__.py
ভিতরে মডিউল থাকে, তবুও যদি আপনি বিতরণ ইউনিটগুলির বিষয়ে কথা বলেন (সাধারণত পাইপিআইয়ের মাধ্যমে) তবে এটি সম্পূর্ণ অন্যরকম প্যাকেজ (সাধারণত অস্তিত্ব দ্বারা সংজ্ঞায়িত setup.py
)। আমি এই দুটি শব্দ package
বিভ্রান্তিকর শব্দের ব্যবহার পেয়েছি এবং আমি পাইথন এমন কিছু প্রাথমিকের সাথে কথা বলেছি যারা একে একে বিভ্রান্তিকর বলে মনে হয়।
প্যাকেজটি এমন একটি মডিউল যা অন্যান্য মডিউল, 'সাধারণ ফাইল-ভিত্তিক মডিউল এবং প্যাকেজগুলি (উপ-প্যাকেজ) থাকতে পারে। প্যাকেজ ধরণের সম্পর্কিত মডিউল সম্পর্কিত কোডটি __init__.py
ফাইলটিতে যায় ।
import pack1
print(type(pack1))
মডিউলগুলি এমন একটি সরল ফাইল যা মডিউল আমদানির পরে ফাংশন, শ্রেণি, চলমান কোড ইত্যাদি ধারণ করতে পারে এটি কোনও বস্তুর মতো আচরণ করে যার মাধ্যমে আপনি মডিউলটিতে সংজ্ঞায়িত শনাক্তকারীদের অ্যাক্সেস করতে পারবেন।