В чем разница между модулем Python и пакетом Python?
Смотрите также: В чем разница между "package" и "module" (для других языков)
В чем разница между модулем Python и пакетом Python?
Смотрите также: В чем разница между "package" и "module" (для других языков)
__init__.py
файл.from plumbum.cmd import ls
реализацию__init__.py
Ответы:
Модуль - это отдельный файл (или файлы), которые импортируются и используются при одном импорте. например
Пакет - это набор модулей в каталогах, которые предоставляют иерархию пакетов.
Документация для модулей
Введение в пакеты
источник
__path__
атрибутом.__init__.py
файл. Это модули, которые могут содержать другие модули.__path__
атрибутом.Любой файл Python является модулем , его имя является базовым именем файла без
.py
расширения. Пакет представляет собой набор модулей Python: в то время как модуль представляет собой один файл Python, пакет представляет собой каталог модулей Python , содержащих дополнительный__init__.py
файл, чтобы отличить пакет из каталога , который только , случается, содержит набор сценариев Python. Пакеты могут быть вложены на любую глубину при условии, что соответствующие каталоги содержат свои собственные__init__.py
файл.Различие между модулем и пакетом, кажется, сохраняется только на уровне файловой системы. Когда вы импортируете модуль или пакет, соответствующий объект, созданный Python, всегда имеет тип
module
. Однако обратите внимание, что при импорте пакета__init__.py
непосредственно видны только переменные / функции / классы в файле этого пакета, а не подпакеты или модули. В качестве примера рассмотримxml
пакет в стандартной библиотеке Python: егоxml
каталог содержит__init__.py
файл и четыре подкаталога; подкаталогetree
содержит__init__.py
файл и, среди прочего,ElementTree.py
файл. Посмотрите, что происходит, когда вы пытаетесь интерактивно импортировать пакет / модули:В Python также есть встроенные модули, такие как
sys
написанные на C, но я не думаю, что вы хотели рассмотреть те из них, которые у вас возникли.источник
module
. Я нахожусь в процессе написания отладчика и беспокоился, что мой отладчик неверно сказал, что мои пакеты былиmodule
s.import
оператора, поскольку дефисы не допускаются в идентификаторах Python. Используйтеimportlib.import_module()
вместо этого.Из глоссария Python :
Файлы Python с тире в имени, например
my-file.py
, не могут быть импортированы с помощью простогоimport
оператора. С точки зрения кода,import my-file
это то же самое,import my - file
что вызовет исключение. Такие файлы лучше охарактеризовать как скрипты, тогда как импортируемые файлы - это модули .источник
Во-первых, имейте в виду, что в своем точном определении модуль - это объект в памяти интерпретатора Python, который часто создается путем чтения одного или нескольких файлов с диска. Хотя мы можем неофициально называть дисковый файл, такой как
a/b/c.py
«модуль», он фактически не становится единым, пока не будет объединен с информацией из нескольких других источников (например,sys.path
) для создания объекта модуля.(Обратите внимание, например, что два модуля с разными именами могут быть загружены из одного и того же файла, в зависимости от
sys.path
других настроек. Это именно то, что происходит сpython -m my.module
последующимimport my.module
в интерпретаторе; там будет два объекта модуля,__main__
иmy.module
оба будут созданы из того же файла на диске,.my/module.py
)Пакет представляет собой модуль , который может иметь подмодули ( в том числе подпакетов). Не все модули могут сделать это. В качестве примера создайте небольшую иерархию модулей:
Убедитесь, что нет других файлов под
a
. Запустите интерпретатор Python 3.4 или более позднейpython3 -i
версии (например, с помощью ) и проверьте результаты следующих утверждений:Модули
a
иa.b
являются пакетами (на самом деле, это пакет определенного типа, называемый «пакет пространства имен», хотя мы не будем беспокоиться об этом здесь). Тем не менее, модульa.b.c
не является пакетом. Мы можем продемонстрировать это, добавив другой файлa/b.py
в структуру каталогов выше и запустив новый интерпретатор:Python гарантирует, что все родительские модули загружаются до загрузки дочернего модуля. Выше он находит, что
a/
это каталог, и, таким образом, создает пакет пространства именa
, иa/b.py
это исходный файл Python, который он загружает и использует для создания (не пакетного) модуляa.b
. На данный момент вы не можете иметь модуль,a.b.c
потому чтоa.b
он не является пакетом и, следовательно, не может иметь подмодулей.Здесь вы также можете видеть, что у модуля пакета
a
есть__path__
атрибут (у пакетов должен быть такой), а у модуля без пакетаa.b
его нет.источник
Поздний ответ, еще одно определение:
Таким образом, физически пакет представляет собой распределительный модуль, который предоставляет один или несколько модулей.
источник
__init__.py
модулем внутри, но если вы говорите о единицах распределения (обычно через PyPI), то это совершенно другой тип пакета (обычно определяемый существованиемsetup.py
). Я нахожу эти два использования терминаpackage
запутывающими, и я говорил с некоторыми новичками Python, которые находят это совершенно изумительным.