Как создать файл init py

Обновлено: 05.07.2024

Python - замечательный язык программирования. Одной из самых слабых его сторон является пакеты. Это общеизвестный факт в сообществе. Установка, импорт, использование и создание пакетов улучшилась с годами, но она по-прежнему не соответствует новым языкам, таким как Go и Rust, которые могут многому научиться из-за проблем Python и других более зрелых языков.

В этом уроке вы узнаете все, что вам нужно знать, чтобы создавать и делиться своими собственными пакетами. Для общей информации о пакетах Python ознакомьтесь с разделом «Как использовать пакеты Python».

Упаковка проекта

Упаковка проекта - это процесс, с помощью которого вы берете надежно согласованный набор модулей Python и, возможно, других файлов и помещаете их в структуру, которую можно легко использовать. Существуют различные вещи, которые вы должны учитывать, такие как зависимости от других пакетов, внутренняя структура (подпакеты), управление версиями, целевая аудитория и форма пакета (исходный код и/или двоичный файл).

Пример

Начнем с быстрого примера. Пакет conman представляет собой пакет для управления конфигурацией. Он поддерживает несколько форматов файлов, а также распределенную конфигурацию с помощью etcd.

Содержимое пакета обычно хранится в одной директории (хотя обычно для разделения подпакетов в нескольких каталогах), а иногда, как и в этом случае, в собственном репозитории git.

Корневой каталог содержит различные файлы конфигурации ( setup.py является обязательным и наиболее важным), а сам код пакета обычно находится в подкаталоге, имя которого является именем пакета и в идеале является каталогом тестов. Вот как это выглядит для «conman»:

Давайте быстро заглянем в файл setup.py. Он импортирует две функции из пакета setuptools: setup() и find_packages() . Затем он вызывает функцию setup() и использует find_packages() для одного из параметров.

Это довольно нормально. Хотя файл setup.py является обычным файлом Python, и вы можете делать все, что хотите, его основное задание - вызвать функцию setup() с соответствующими параметрами, поскольку он будет запускаться различными инструментами стандартным способом при установке вашего пакета. Я расскажу подробности в следующем разделе.

Файлы конфигурации

В дополнение к setup.py есть еще несколько дополнительных файлов конфигурации, которые могут отображаться здесь и обслуживать различные цели.

Setup.py

Функция setup() принимает большое количество именованных аргументов для управления многими аспектами установки пакета, а также для запуска различных команд. Многие аргументы указывают метаданные, используемые для поиска и фильтрации при загрузке вашего пакета в репозиторий.

  • name: имя вашего пакета (и как оно будет указано в PYPI)
  • version: это важно для поддержания правильного управления зависимостями
  • url: URL вашего пакета, обычно GitHub или URL-адрес readthedocs
  • packages: список подпакетов, которые необходимо включить; здесь помогает find_packages()
  • setup_requires: здесь вы указываете зависимости
  • test_suite: какой инструмент запускается во время тестирования

long_description устанавливается здесь на содержимое файла README.md , что является наилучшей практикой для использования одного источника правды.

setup.cfg

Файл setup.py также поддерживает интерфейс командной строки для запуска различных команд. Например, чтобы запустить модульные тесты, вы можете ввести: python setup.py test

Файл setup.cfg является файлом формата ini, который может содержать параметры по умолчанию для команд, которые вы передаете setup.py . Здесь setup.cfg содержит некоторые опции для nosetests (наш тестовый раннер):

MANIFEST.in

Этот файл содержит файлы, которые не являются частью внутреннего каталога пакетов, но вы все еще хотите включить его. Обычно это файл readme , файл лицензи Важным файлом является файл requirements.txt . Этот файл используется pip для установки других необходимых пакетов.

Вот файл MANIFEST.in в conman:

Зависимости

Вы можете указать зависимости как в разделе install_requires файла setup.py , так и в файле requirements.txt . Pip установит автоматически зависимости от install_requires , но не из файла requirements.txt . Чтобы установить эти требования, вам нужно будет указать его явно при запуске pip install -r requirements.txt .

Параметр install_requires предназначен для указания минимальных и более абстрактных требований на основном уровне версии. Файл requirements.txt предназначен для более конкретных требований, часто с привязкой к второстепенным версиям.

Вот файл требований conman. Вы можете видеть, что все версии зафиксированы, что означает, что это может негативно повлиять, если один из этих пакетов обновится и внесет изменения, которые ломают conman.

Пиннинг дает вам предсказуемость и спокойствие. Это особенно важно, если многие люди устанавливают ваш пакет в разное время. Без закрепления каждый человек получит различное сочетание версий зависимостей на основе того, когда они его установили. Недостатком пиннинга является то, что если вы не справляетесь с развитием зависимостей, вы можете застрять на старой, плохо исполняющейся и даже уязвимой версии некоторой зависимости.

Я изначально написал conman в 2014 году и не обращал на него особого внимания. Теперь для этого урока я обновил все, и для почти каждой зависимости были некоторые существенные улучшения.

Распределения

Вы можете создать дистрибутив источника или бинарный дистрибутив. Я расскажу об обоих.

Распределение источников

Вы создаете исходный дистрибутив с помощью команды: python setup.py sdist . Вот вывод для conman:

Как вы можете видеть, я получил одно предупреждение о том, что отсутствует файл README с одним из стандартных префиксов, потому что мне нравится Markdown, поэтому вместо этого у меня есть «README.md». Кроме этого, все исходные файлы пакета были включены и дополнительные файлы. Затем в каталоге conman.egg-info была создана куча метаданных. Наконец, создается сжатый tar-архив под названием conman-0.3.tar.gz и помещается в подкаталог dist .

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

Conman был установлен в site-packages и может быть импортирован как любой другой пакет:

Wheels

Wheels - относительно новый способ упаковки кода Python и, возможно, C-расширений. Они заменяют формат egg. Существует несколько типов колес: чистые колеса Python, платформы и универсальные колеса. Чистые колеса Python - это пакеты, такие как conman, у которых нет кода расширения C.

Платформенные колеса имеют код расширения C. Универсальные колеса - это чистые колеса Python, которые совместимы как с Python 2, так и с Python 3 с одинаковой базой кода (они не требуют даже 2to3). Если у вас есть чистый пакет Python и вы хотите, чтобы ваш пакет поддерживал как Python 2, так и Python 3 (становится все более и более важным), вы можете создать единую универсальную сборку вместо одного колеса для Python 2 и одного колеса для Python 3.

Если в вашем пакете есть код расширения C, вы должны создать колесо платформы для каждой платформы. Огромное преимущество колес, особенно для пакетов с расширениями C, заключается в том, что нет необходимости иметь компилятор и поддерживающие библиотеки, доступные на целевой машине. Колесо уже содержит встроенный пакет. Таким образом, вы знаете, что его гораздо быстрее установить, потому что это буквально просто копия. Люди, которые используют научные библиотеки, такие как Numpy и Pandas, действительно могут это оценить, поскольку установка таких пакетов требует много времени и может быть неудачной, если какая-то библиотека отсутствует или компилятор не настроен должным образом.

Команда для создания чистых или платформенных колес: python setup.py bdist_wheel .

Setuptools - движок, который обеспечивает функцию setup() , будет автоматически обнаруживаться, если требуется чистое или платформенное колесо.

При проверке каталога dist вы можете увидеть, что было создано чистое колесо Python:

Название «conman-0.3-py2-none-any.whl» имеет несколько компонентов: имя пакета, версию пакета, версию Python, версию платформы и, наконец, расширение «whl».

Чтобы создавать универсальные пакеты, вы просто добавляете --universal , как в python setup.py bdist_wheel --universal .

Полученное колесо называется "conman-0.3-py2.py3-none-any.whl".

Обратите внимание, что вы несете ответственность за то, чтобы ваш код действительно работал как с Python 2, так и с Python 3, если вы создаете универсальный пакет.

Заключение

Написание собственных пакетов Python требует использования большого количества инструментов, определения большого количества метаданных и тщательного анализа ваших зависимостей и целевой аудитории. Но награда велика.

Если вы правильно напишите полезный код и упакуете его, люди смогут легко его установить и извлечь из него выгоду.

Пакеты в Python

Пространства имен это неотъемлемая часть программирования, так как позволяет избегать конфликтов имен при операциях импорта. В Python данную функцию выполняют пакеты. Пакет в Python - это папка с модулями и файлом init.py. Модули в Python, в свою очередь - это файлы кода, с расширением .py. Для более детального понимания сути сказанного, создадим папку с именем mypackage и рядом файл main.py. Это будет главный файл, с которого начнет выполняться программа. В папку mypackage поместим файлы module1 и module2 и определим в них переменные и методы:

def do_some():
pass

d = 5
e = 7
f = "website"

Теперь в главном файле main.py, находящимся на уровне папки mypackage попробуем импортировать наш будущий папку/пакет mypackage. Но прежде, напомню, что в Python есть несколько вариантов импорта. В зависимости от того импортируем мы сам пакет, модуль из него или же переменные и методы модуля

Также можно обойтись без названия папки, путем импорта самих модулей или же переменной из модуля:

from mypackage import module1, module2 print(module.a) from mypackage.module1 import a print(a)

Но как мы знаем в Python можно импортировать пакет и все переменные модулей будут видны из одного места. Чтобы превратить нашу папку в пакет, в папке mypackage создадим файл init.py. И каждый раз при импорте модуля первым исполнится данный файл. Для проверки сказанного поместим в него print("init"):

Так для чего это нужно. Как мы уже знаем при импорте кода в виде модуля из папки/пакета мы используем import mypackage.module1. И чтобы постоянно не обращаться ко всем модулям в папке, так как их может быть много мы и используем файл init.py

from . module1 import a, b, с

from . module2 import d, e, f

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

Таким образом в Python достаточно просто превратить папку с кодом в пакет, и тем самым повысив удобочитаемость импортируемого кода.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 0 ):

Пакеты Python используются для организации модулей в каталог. Как создать и получить доступ к модулям пакета, пакет Python __init__.py, импортировать * из пакета.

Как создать пакет Python?

Мы можем создать пакет, следуя под шагом.

Что мы можем сохранить в пакете Python?

  • Файл инициализации
  • Модули Python
  • Сценарии Python
  • Любой другой тип файлов

Можем ли мы создать подпункты в Python?

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

Примеры пакета Python

Давайте посмотрим на несколько примеров создания и использования пакетов.

1. Создание пакета

2. Добавление модулей в пакет

Мы хотим добавить эти модули на наши пакеты. Просто скопируйте эти файлы в каталог пакетов, где вы хотите сохранить эти модули.

3. Импорт модулей из пакета

Синтаксис для импорта модуля Python внутри пакета:

Python использует sys.path Переменная для поиска пакетов и модулей. Текущий каталог является частью sys.path Переменная. Таким образом, мы будем держать наш сценарий Python в Python-пакеты каталог. В противном случае нам придется добавить местоположение пакета в sys.path Переменная.

Вот код my_script.py для доступа к модулям из пакетов и вызов их функциями.

Мы также можем импортировать модуль, используя ниже синтаксис:

Вот обновленный пример для доступа к модулю «Math» и «STR_UTILS» в нашей программе.

4. Импорт * из пакета

Мы можем импортировать каждый модуль из пакета, используя следующий синтаксис.

В этом случае Python ищет sub_package2 для пакетов, модулей и функций. Это может создавать побочные эффекты, импортируя то, что вы не хотите. Кроме того, это очень много времени.

Мы можем определить список модулей, которые будут импортированы путем создания __All__ Переменная в файле __init__.py.

Обновленный код my_script.py:

Обратите внимание, что код Python в __init__.py выполняется сначала, когда пакеты инициализированы и импортируются.

Как добавить пакет на системный путь

Неиспользуется, чтобы всегда зависеть от иерархии каталога для импорта модулей пакетов. Мы можем добавить наш пользовательский пакет в переменную SYSSPATH, а затем импортировать их в любой скрипт.

Заключение

Пакеты в Python позволяют разделить наши прикладные модули и скрипты в логические модули. Это сохраняет нашу кодовую базу чистой и легко в обслуживании.

Структура пакета

Создаём свой пакет Python

Сборка пакета

Более подробно об этом файле можно прочитать в документации.

Указываем зависимости

Для того, чтобы с пакетом можно было работать сразу после установки, вы должны указать в его конфигурации, от каких пакетов он зависит, чтобы они были сразу же установлены. Нужно просто вставить ‘install_requires=[…]’ в функцию setup. Можно также задать версию зависимости:

Дополнительные файлы

Иногда бывает необходимость вложить в пакет другие типы файлов. Для этого:

  1. Задайте ‘include_package_data=True’
  2. Создайте файл MANIFEST.in в папке с setup.py
  3. Добавьте путь до файла в MANIFEST как ‘include /path/to/test.json’, путь при этом относительный. Также можно использовать поисковый шаблон типа ‘*.json’.
Сборка

Теперь у нас всё готово, приступаем к сборке пакета. Это значит, что мы создадим дистрибутив исходного кода (напр., tar.gz) или бинарный файл (напр., wheel). Это очень просто.

В результате у нас в папке ‘./dist’ появятся оба формата. при этом имя дистрибутива будет присвоено исходя из имени пакета и его версии.

Распространение пакета

Поздравляю, вы создали замечательный пакет! Теперь необходимо выложить его для общего доступа. Мы загрузим его на Pypi, поэтому в будущем можно будет его установить командой ‘pip install’.

Для начала создайте учётную запись на сайте pypi.

При этом файлы из папки ‘dist/’ выгрузятся в каталог pypi. Также вы можете явно указать только определённый файл для выгрузки. Twine это специальная утилита для работы с pypi. При первой загрузке пакета она зарегистрирует пакет в pypi.

Работа с пакетом

Теперь ваш пакет опубликован в pypi. Для его установки достаточно набрать ‘pip install my_package’, а затем в коде ‘import my_package’.

При локальной разработке пакета для его тестирования добавьте путь к нему в $PYTHONPATH. Но если вы не хотите трогать переменные окружения, установите его командой ‘pip install -e .’ из папки с пакетом.

Читайте также: