পাইথন মডিউল এবং পাইথন প্যাকেজের মধ্যে পার্থক্য কী?


575

পাইথন মডিউল এবং পাইথন প্যাকেজের মধ্যে পার্থক্য কী?

আরও দেখুন: "প্যাকেজ" এবং "মডিউল" (অন্যান্য ভাষার জন্য) মধ্যে পার্থক্য কী?


9
আমি ভুল হতে পারি তবে আমার জন্য: মডিউলটি মূলত একটি অজগর ফাইল। একটি প্যাকেজ হ'ল একটি ফোল্ডার যা একগুচ্ছ মডিউল (পাইথন ফাইল)।
lc2817

36
প্যাকেজ হিসাবে বিবেচনা করার জন্য, সেই ফোল্ডারে অবশ্যই একটি __init__.pyফাইল থাকতে হবে।
জিউলিও পিয়ানাস্টেল্লি

@ lc2817: এটা সবচেয়ে সাধারণ ক্ষেত্রে দেখা যায় কিন্তু এটা প্রয়োজনীয় জন্য একটি মডিউল একটি ফাইল সিস্টেম যেমন থেকে লোড করা হয় না, দেখতে from plumbum.cmd import lsবাস্তবায়ন
JFS

4
@ জিউলিওপিয়ানক্যাসেল্লি: পাইথন ৩.৩++ তে, নেমস্পেস প্যাকেজগুলি ব্যবহার করা হয় না__init__.py
jfs

পাইথন প্যাকেজ এবং পাইপআই / চাকা / ইত্যাদির মতো পাইথন উপাদান বিতরণের জন্য ব্যবহৃত প্যাকেজগুলির মধ্যে সম্প্রদায় কীভাবে পার্থক্য করতে পারে? দুটো আমার কাছে "প্যাকেজ" শব্দের বিভিন্ন প্রয়োগের মতো বলে মনে হচ্ছে।
ডেভিডা

উত্তর:


372

মডিউল হ'ল একক ফাইল (বা ফাইল) যা এক আমদানির অধীনে আমদানি করা হয় এবং ব্যবহৃত হয়। যেমন

import my_module

একটি প্যাকেজ হ'ল ডিরেক্টরিগুলির মডিউলগুলির সংকলন যা প্যাকেজ স্তরক্রম দেয়।

from my_package.timing.danger.internets import function_of_love

মডিউলগুলির জন্য ডকুমেন্টেশন

প্যাকেজ পরিচিতি


54
আপনি যখন বলছেন: "মডিউলটি একটি একক ফাইল (বা ফাইল) যা একটি আমদানির আওতায় আমদানি করা হয়" আপনি যখন মডিউল যেখানে একাধিক ফাইলের পরিস্থিতি বর্ণনা করতে পারেন? নাকি আমি আপনার অর্থ ভুল বোঝাচ্ছি?
ব্যবহারকারীর

5
মডিউল তৈরি করতে আপনার কোনও ফাইলের দরকার নেই যেমন, আপনি জিপ ফাইল থেকে একটি মডিউল আমদানি করতে পারেন। প্যাকেজগুলির জন্য একই। পাইথনে মডিউল / প্যাকেজগুলির জন্য কেবল একটি ক্লাস রয়েছে। প্যাকেজটি একটি __path__বৈশিষ্ট্য সহ কেবলমাত্র একটি মডিউল ।
jfs

33
প্যাকেজগুলি মডিউলগুলিও । এগুলি কেবল আলাদাভাবে প্যাকেজ করা হয়েছে; তারা একটি ডিরেক্টরি প্লাস __init__.pyফাইলের সংমিশ্রণে গঠিত হয় । এগুলি মডিউল যা অন্যান্য মডিউল থাকতে পারে।
মার্টিজন পিটারস

15
@ জ্যাককোট নিশ্চিত, রেফারেন্স ডকুমেন্টেশনে আমদানি সিস্টেমটি দেখুন : সমস্ত প্যাকেজগুলি মডিউল রয়েছে তা মনে রাখা গুরুত্বপূর্ণ
মার্টিজন পিটারস

6
@Jacquot: এবং "প্যাকেজ" উপর শব্দকোষ : একটি পাইথন মডিউল যা submodules বা recursively, subpackages থাকতে পারে। প্রযুক্তিগতভাবে, একটি প্যাকেজ একটি __path__অ্যাট্রিবিউটযুক্ত পাইথন মডিউল ।
মার্টিজন পিটারস

556

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


9
সুস্পষ্টভাবে উল্লেখ করার জন্য ধন্যবাদ যে পাইথন দ্বারা নির্মিত সম্পর্কিত অবজেক্টটি সর্বদা টাইপ থাকে module। আমি একটি ডিবাগার লেখার প্রক্রিয়ায় আছি এবং চিন্তিত ছিলাম যে আমার ডিবাগারটি আমার প্যাকেজগুলি হ'ল তা ভুল বলেছিল module
আর্টঅফ ওয়ারফেয়ার

8
ড্যাশযুক্ত ফাইলের নামযুক্ত জোলভি পাইথন ফাইলগুলি এখনও সাধারণ importবিবৃতি দিয়ে নয়, মডিউল হিসাবে আমদানি করা যায় , কারণ পাইথন শনাক্তকারীগুলিতে ড্যাশগুলির অনুমতি নেই। importlib.import_module()পরিবর্তে ব্যবহার করুন।
জিউলিও পিয়ানোস্টেল্লি

2
@ জোলভি আমি নেই আমার মন্তব্যে আপনি কোথায় পড়ছেন? আমি কেবল এটিই বলছি, যদি আপনি পাইথন ফাইলটির নামে ড্যাশ যুক্ত করে বা হোঁচট খেয়ে পড়ে থাকেন তবে আপনি এটি মডিউল হিসাবে আমদানি করতে পারেন। আমি পাইথন ফাইলের নামকরণের পছন্দের উপায় সম্পর্কে কোনও বিবৃতি দিচ্ছি না। আমি নিশ্চিত যে আপনি এটি অন্য কোথাও খুঁজে পেতে পারেন: সাধারণত আন্ডারস্কোরের পক্ষে ড্যাশগুলি এড়ানোর পরামর্শ দেওয়া হয়।
জিউলিও পিয়ানোস্টেলি

3
পাইথনে নতুন হওয়া, প্যাকেজ প্যাকেজ আমদানির সময় সাব-প্যাকেজগুলি বা মডিউলগুলি ডিফল্টরূপে উপলব্ধ নয়। এটিই আমাকে হোঁচট খাচ্ছে। এর কি কোনও বিশেষ কারণ আছে? এবং প্যারেন্ট প্যাকেজটি আমদানির সময় কীভাবে উপ-প্যাকেজগুলি বা মডিউলগুলি উপলব্ধ (তাদের সম্পূর্ণরূপে যোগ্য নামের মাধ্যমে) উপলব্ধ করবেন তা সাধারণ প্যাটার্নে রয়েছে ?
স্কুবার্থ

2
@ এসচুবার্থ একটি প্যারেন্ট প্যাকেজটির init .py এ উপ-প্যাকেজগুলি আমদানি করুন ।
আনা

33

থেকে পাইথন শব্দকোষ :

এটি মনে রাখা গুরুত্বপূর্ণ যে সমস্ত প্যাকেজ মডিউল, তবে সমস্ত মডিউল প্যাকেজ নয় are অথবা অন্যভাবে বলতে গেলে প্যাকেজগুলি কেবলমাত্র একটি বিশেষ ধরণের মডিউল। বিশেষত, যে কোনও মডিউলটিতে একটি __path__বৈশিষ্ট্য রয়েছে তাকে প্যাকেজ হিসাবে বিবেচনা করা হয়।

নামে ড্যাশযুক্ত পাইথন ফাইলগুলি my-file.py, সাধারণ importবিবৃতি দিয়ে আমদানি করা যায় না । কোড-ওয়াইজ, import my-fileএকই রকম import my - fileযা ব্যতিক্রম বাড়িয়ে তুলবে। এই জাতীয় ফাইলগুলি স্ক্রিপ্ট হিসাবে আরও বেশি বৈশিষ্ট্যযুক্ত যেখানে আমদানিযোগ্য ফাইলগুলি মডিউল


23

প্রথমে মনে রাখবেন যে এর সঠিক সংজ্ঞা অনুসারে মডিউলটি পাইথন ইন্টারপ্রেটারের স্মৃতিতে একটি বস্তু যা প্রায়শই ডিস্ক থেকে এক বা একাধিক ফাইল পড়ে তৈরি করা হয়। যদিও আমরা অনানুষ্ঠানিকভাবে একটি ডিস্ক ফাইল যেমন 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তা দেয় না।


1
যদি আপনার ইতিমধ্যে না থাকে তবে ফিরে যান এবং এই উত্তরের উদাহরণগুলির মাধ্যমে কাজ করুন।
ডোনাল লাফার্টি

2

দেরিতে উত্তর, অন্য একটি সংজ্ঞা:

একটি প্যাকেজটি আমদানি করা শীর্ষ-সত্তা দ্বারা প্রতিনিধিত্ব করা হয় যা হয় স্ব-অন্তর্ভুক্ত মডিউল হতে পারে, বা __init__.pyউপ ডিরেক্টরি কাঠামোর মধ্যে মডিউলগুলির সেট থেকে শীর্ষ-সত্তা হিসাবে বিশেষ মডিউল।

সুতরাং শারীরিকভাবে একটি প্যাকেজ হল একটি বিতরণ ইউনিট, যা এক বা একাধিক মডিউল সরবরাহ করে।


1
পাইথনে প্যাকেজের জন্য দুটি সংজ্ঞা রয়েছে এবং সেগুলি আলাদা। আপনার উত্তরগুলি এগুলি একত্রিত বলে মনে হচ্ছে। কড়া কথায় বলতে গেলে পাইথন প্যাকেজটি হ'ল একটি ডিরেক্টরি যা __init__.pyভিতরে মডিউল থাকে, তবুও যদি আপনি বিতরণ ইউনিটগুলির বিষয়ে কথা বলেন (সাধারণত পাইপিআইয়ের মাধ্যমে) তবে এটি সম্পূর্ণ অন্যরকম প্যাকেজ (সাধারণত অস্তিত্ব দ্বারা সংজ্ঞায়িত setup.py)। আমি এই দুটি শব্দ packageবিভ্রান্তিকর শব্দের ব্যবহার পেয়েছি এবং আমি পাইথন এমন কিছু প্রাথমিকের সাথে কথা বলেছি যারা একে একে বিভ্রান্তিকর বলে মনে হয়।
ডেভিডা

@ ডেভিডা, আপনি যেমন অনুভব করছেন ঠিক এটি নয়। এটি কোডিং হয়েছে: প্যাকেজিং.পিথন.আর /
লোরেম ইপসাম

0

প্যাকেজটি এমন একটি মডিউল যা অন্যান্য মডিউল, 'সাধারণ ফাইল-ভিত্তিক মডিউল এবং প্যাকেজগুলি (উপ-প্যাকেজ) থাকতে পারে। প্যাকেজ ধরণের সম্পর্কিত মডিউল সম্পর্কিত কোডটি __init__.pyফাইলটিতে যায় ।

import pack1
print(type(pack1))

মডিউলগুলি এমন একটি সরল ফাইল যা মডিউল আমদানির পরে ফাংশন, শ্রেণি, চলমান কোড ইত্যাদি ধারণ করতে পারে এটি কোনও বস্তুর মতো আচরণ করে যার মাধ্যমে আপনি মডিউলটিতে সংজ্ঞায়িত শনাক্তকারীদের অ্যাক্সেস করতে পারবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.