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

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

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

453
31 окт. '11 в 1:53
источник поделиться
7 ответов

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

import my_module

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

from my_package.timing.danger.internets import function_of_love

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

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

303
31 окт. '11 в 1:55
источник

Связанные вопросы


Похожие вопросы

Любой файл Python является module, его имя является базовым именем файла без расширения .py. A package - это набор модулей 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, но я не думаю, что вы хотели рассмотреть их в своем вопросе.

454
31 окт. '11 в 2:29
источник

Из глоссария Python:

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

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

26
16 янв. '16 в 14:54
источник

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

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

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

$ 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 и ab являются пакетами (на самом деле, это пакет определенного типа, называемый "пакет пространства имен", хотя мы не будем беспокоиться об этом здесь). Однако модуль abc не является пакетом. Мы можем продемонстрировать это, добавив другой файл 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, который он загружает и использует для создания (не пакетного) модуля ab. На этом этапе у вас не может быть модуля abc потому что ab не является пакетом и, следовательно, не может иметь подмодулей.

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

12
22 марта '18 в 6:44
источник

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

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

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

0
20 нояб. '16 в 17:51
источник

Модуль - это просто файл Python, который вы можете использовать в своей программе, импортируя его с помощью операторов import или or из модуля import var, function.

Пакет - это способ организации вашего кода. Пакеты позволяют импортировать каталоги на вашем компьютере в ваши программы, используя операторы "import" или "from import". Каталог в вашей системе может стать пакетом, если он содержит пустой

0
20 дек. '18 в 12:30
источник

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

-3
21 дек. '16 в 19:11
источник

Посмотрите другие вопросы по меткам или Задайте вопрос