В чем разница между модулем 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, но я не думаю, что вы хотели рассмотреть их в своем вопросе.
важно иметь в виду, что все пакеты модулей, но не все модули пакеты. Или, другими словами, пакеты-это просто особый вид модуля. В частности, любой модуль, содержащий
__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-сущность из набора модулей в структуре подкаталогов.
таким образом, физически пакет является единицей распределения, которая предоставляет один или несколько модулей.
Итак, вы помните, что в ваших текстовых книгах главы на странице содержимого были разделены на модули. Таким образом, существует концепция различных глав, которые имеют одну и ту же цель или часть одной и той же теории, тогда эти части сгруппированы вместе и известны как модуль. Аналогично, в программировании, когда различные функции группируются вместе, они разделяются и называются модулем.