В чем разница между модулем Python и пакетом Python? - PullRequest
477 голосов
/ 31 октября 2011

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

См. Также: В чем разница между "package" и "module" (для других языков)

Ответы [ 6 ]

473 голосов
/ 31 октября 2011

Любой файл Python представляет собой модуль , его имя является базовым именем файла без расширения .py. Пакет представляет собой набор модулей Python: в то время как модуль представляет собой отдельный файл Python, пакет представляет собой каталог модулей Python, содержащий дополнительный файл __init__.py, чтобы отличить пакет от каталога, который только что произошел. содержать кучу скриптов Python. Пакеты могут быть вложены на любую глубину при условии, что соответствующие каталоги содержат собственный файл __init__.py.

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

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

318 голосов
/ 31 октября 2011

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

import my_module

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

from my_package.timing.danger.internets import function_of_love

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

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

29 голосов
/ 16 января 2016

Из Глоссарий Python :

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

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

13 голосов
/ 22 марта 2018

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

(Обратите внимание, например, что два модуля с разными именами могут быть загружены из одного и того же файла, в зависимости от sys.path и других настроек. Это именно то, что происходит с python -m my.module, за которым следует import my.module в интерпретаторе ; будет два объекта модуля, __main__ и my.module, оба созданы из одного и того же файла на диске, my/module.py.)

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

$ 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__ (пакет должен иметь его), а модуль не 10 * a.b не имеет.

1 голос
/ 20 ноября 2016

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

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

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

0 голосов
/ 21 декабря 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...