В чем разница между модулем Python и пакетом Python?

в чем разница между модулем Python и пакетом Python?

Читайте также: в чем разница между "пакетом"и " модулем" (для других языков)

6 ответов


модуль-это один файл (или файлы), которые импортируются в рамках одного импорта и используются. например,

import my_module

пакет-это набор модулей в каталогах, которые дают иерархии пакета.

from my_package.timing.danger.internets import function_of_love

документация на модули

введение в пакеты


любой файл Python является модуль, его имя является базовым именем файла без .

различие между модулем и пакет, по-видимому, только на уровне файловой системы. При импорте модуля или пакета соответствующий объект, созданный Python, всегда имеет тип module. Обратите внимание, однако, что при импорте пакета только переменные / функции / классы в __init__.py файл этого пакета непосредственно виден,не суб-пакеты или модули. В качестве примера, рассмотрим!--6--> пакет в стандарте Python библиотека: ее xml каталог содержит __init__.py файл и четыре подкаталога; подкаталог etree содержит элемент __init__.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>

в Python есть встроенные модули, такие как sys, это написано на C, но я не думаю, что вы хотели рассмотреть их в своем вопросе.


С словарь Python:

важно иметь в виду, что все пакеты модулей, но не все модули пакеты. Или, другими словами, пакеты-это просто особый вид модуля. В частности, любой модуль, содержащий __path__ атрибут считается пакетом.

файлы Python с тире в имени, как my-file.py, невозможно импортировать с помощью простого import заявление. Код-мудрый, import my-file это то же самое, что import my - file что вызовет исключение. Такие файлы лучше охарактеризовать как скрипты в то время как импортируемые файлы модули.


во-первых, имейте в виду, что в своем точном определении a модуль - это объект в памяти интерпретатора Python, часто созданный путем чтения одного или нескольких файлов с диска. Хотя мы можем неофициально вызвать дисковый файл, такой как a/b/c.py "модуль", он фактически не становится одним, пока он не будет объединен с информацией из нескольких других источников (например,sys.path) для создания объекта модуля. (Обратите внимание, например, что два модуля с разными именами могут быть загружены из одного и того же файл, в зависимости от sys.path и другие параметры.)

A пакета - это модуль, который может иметь подмодули (включая подпакеты). Не все модули могут это сделать. В качестве примера создайте небольшую иерархию модулей:

$ mkdir -p a/b
$ touch a/b/c.py

убедитесь, что нет других файлов в разделе a. Запустите интерпретатор Python 3.4 или более поздней версии (например, с 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__'

Python гарантирует, что все родительские модули загружаются до загрузки дочернего модуля. Выше он находит, что a/ - каталог, и поэтому создает пакета a, и что a/b.py является исходным файлом Python, который он загружает и использует для создания (не-пакета) модуля a.b. На данный момент у вас не может быть модуля a.b.c, потому что a.b не является пакетом и, следовательно, не может иметь подмодулей.

вы также можете увидеть здесь, что модуль пакета a есть __path__ атрибут (пакеты должны иметь это), но модуль non-package a.b нет.


поздний ответ, еще одно определение:

пакет представлен импортированной верхней сущностью, которая может либо быть автономным модулем, или __init__.py специальный модуль, как top-сущность из набора модулей в структуре подкаталогов.

таким образом, физически пакет является единицей распределения, которая предоставляет один или несколько модулей.


Итак, вы помните, что в ваших текстовых книгах главы на странице содержимого были разделены на модули. Таким образом, существует концепция различных глав, которые имеют одну и ту же цель или часть одной и той же теории, тогда эти части сгруппированы вместе и известны как модуль. Аналогично, в программировании, когда различные функции группируются вместе, они разделяются и называются модулем.