Лайфхаки

Маленькие, полезные хитрости

Учимся создавать пакеты Python. Пакеты Python — создание и доступ

01.06.2023 в 19:23

Учимся создавать пакеты Python. Пакеты Python — создание и доступ

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

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

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

  1. Создайте каталог пакета – для этого мы можем использовать terminal или Python IDE.
  2. Создать __init__.py файл — это необходимо для преобразования обычного каталога в пакет python. Этот файл используется для инициализации пакета и перечисления всех модулей. В самом простом виде этот файл может быть пустым.

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

  • Файл инициализации;
  • Модули;
  • Скрипты;
  • Любой другой тип файлов.

В общем, пакет — это каталог в наших компьютерных системах. Единственное отличие — это обязательное включение файла __init__.py.

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

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

Примеры

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

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

$ mkdir utilities $ touch utilities/__init__.py $ mkdir utilities/strings $ mkdir utilities/strings/__init__.py $ tree . └── utilities ├── __init__.py └── strings └── __init__.py 3 directories, 1 file $

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

Допустим, у нас есть два модуля Python — math.py и str_utils.py. У них есть несколько функций, которые будут использоваться в нашей программе.

math.py:

def add(x, y): return x + y def multiply(x, y): return x * y

str_utils.py:

def to_uppercase(s): s = str(s) return s.upper() def reverse(s): s = str(s) return s<::-1>

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

$ ls math.py str_utils.py utilities $ mv math.py utilities $ mv str_utils.py utilities/strings $ tree . └── utilities ├── __init__.py ├── math.py └── strings ├── __init__.py └── str_utils.py 3 directories, 3 files $

3. Импорт пакета

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

import package.sub_package1.sub_package2.module import package.sub_package1.sub_package2.module as module

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

$ cat my_script.py import sys print(sys.path) $ python3.7 my_script.py $

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

import utilities.math as math import utilities.strings.str_utils as str_utils print(math.add(10, 20)) print(str_utils.reverse("ABC"))

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

from package.sub_package1.sub_package2 import module

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

from utilities import math from utilities.strings import str_utils print(math.add(10, 20)) print(str_utils.reverse("ABC"))

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

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

Пакет Python. Packaging Python Projects

This tutorial walks you through how to package a simple Python project. It will show you how to add the necessary files and structure to create the package, how to build the package, and how to upload it to the Python Package Index (PyPI).

Tip

If you have trouble running the commands in this tutorial, please copy the command and its output, thenon therepository on GitHub. We’ll do our best to help you!

A simple project

This tutorial uses a simple project named example_package_YOUR_USERNAME_HERE . If your username is me , then the package would be example_package_me ; this ensures that you have a unique package name that doesn’t conflict with packages uploaded by other people following this tutorial. We recommend following this tutorial as-is using this project, before packaging your own project.

Create the following file structure locally:

packaging_tutorial/ └── src/ └── example_package_YOUR_USERNAME_HERE/ ├── __init__.py └── example.py

The directory containing the Python files should match the project name. This simplifies the configuration and is more obvious to users who install the package.

__init__.py is required to import the directory as a package, and should be empty.

example.py is an example of a module within the package that could contain the logic (functions, classes, constants, etc.) of your package. Open that file and enter the following content:

If you are unfamiliar with Python’sand, take a few minutes to read over the.

Once you create this structure, you’ll want to run all of the commands in this tutorial within the packaging_tutorial directory.

Python пакеты __init__. Как работает __init__.py?

Цитирую документацию:

The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path
Допустим, в одном каталоге из sys.path есть папка package1 . Его структура:

package1/ sub_package1/ module1.py sub_package2/ module2.py

Далее в интерпретаторе я пишу import package1. Почему нельзя просто найти папку package1 и импортировать её без __init__.py? (т.е, почему питону не понятно, что папка с модулями и с нужным названием - это пакет, который нужно импортировать?) Можете привести пример случая prevent directories with a common name, such as string, from unintentionally hiding valid modules или случая, когда __init__.py полезен?

    PrAw @remzalp

    1. создай каталог sys рядом со скриптом,
    потом импортируй sys
    работает?
    2. добавь в каталог sys/__init__.py
    потом импортируй sys
    работает?
    Именно для того, чтобы каталог с файлами внезапно стал модулем требуется не совсем обычное действие.

    Написано

    PyLearner @PyLearner Автор вопроса

    PrAw , а в чем логика не импортировать свой пакет sys без init, если я создал его и переместил в папку с пакетами?
    Какая была логика создания init.py? Это по типу "А что если юзер создаст свой пакет sys, переместит его в одну из директорий sys.path, но не захочет его использовать. Сделаем так, чтобы пакеты без init не импортировались, если пакет с таким же именем и init есть"? Только для таких случаев был создан init?

    Написано

    PyLearner @PyLearner Автор вопроса

    Грубо говоря, мне непонятно вот что:
    1) Почему питон сам не может идентифицировать и импортировать пакет без init, если:
    a) Папка содержит модули
    b) Папка находится в нужной директории из sys.path
    c) Папка имеет то же имя, что и я ввожу
    Я уверен, что это легко могло быть реализовано, но не сделано из-за каких-то нюансов. Каких? Для включения\отключения каких-то дублей?
    2) Если я создал пакет с таким же именем, что уже встроен в Питон, переместил его в нужную директорию, то очевидно я хочу его использовать? Иначе зачем я его создавал и перемещал, куда надо? Если я не хочу использовать пакет с таким же именем, то я его просто удалю из виртуальной среды?

    Написано

    PrAw @remzalp

    PyLearner ,
    1. В файле может быть дополнительная логика инициализации
    2. Наличие этого файла гарантирует, что случайное совпадение имени каталога и имени импортируемого пакета не сделает в сумме модуль.

Какие файлы можно добавить в пакет Python. Архитектура программы

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

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

На этом рисунке модуль top_module.py – это файл Python верхнего уровня, который импортирует функции, определенные в модуле module1, но также имеет доступ к функциям в module2 через module1. Два пользовательских модуля используют ресурсы друг друга, а также другие модули из стандартной библиотеки Python. Цепочка импорта может идти настолько глубоко, насколько нужно – нет ограничений в количестве импортированных файлов, и они могут импортировать друг друга, хотя нужно быть осторожным с циклическими импортами.

# top_module.py import module1 module1.print_parameters() print(module1.combinations(5, 2)) # module1.py from module2 import k, print_parameters from math import factorial n = 5.0 def combinations(n, k): return factorial(n) / factorial(k) / factorial(n-k) # module2.py import module1 k = 2.0 def print_parameters(): print('k = %.f n = %.f' % (k, module1.n))

В приведенном выше примере top_module.py – это модуль верхнего уровня, который будет запускаться пользователем, и он импортирует инструменты из других модулей через module1.py. module1 и module2 являются определяемыми пользователем модулями, а модуль math импортируется из стандартной библиотеки. При запуске скрипта верхнего уровня получаем:

$ python top_module.py k = 2 n = 5
10.0

Когда запускается файл Python верхнего уровня, его операторы исходного кода и операторы в импортированных модулях компилируются в промежуточный формат, известный как байт код, который является независимым от платформы. Файлы байт кода импортированных модулей хранятся с расширением .pyc в том же каталоге, что и .py-файл для версий Python до 3.2, и в каталоге pycache / в текущем каталоге программы в Python 3.2+.

Python, как сделать пакет. Пакеты в Python

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

Например, если вы хотите получить доступ к модулю «sample_module» в пакете с именем «sample_package», вы можете сделать это с помощью sample_package.sample_module.

Короче говоря, пакет Python упрощает работу с несколькими модулями.

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

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

music/ Top-level package __init__.py Initialize the music package formats/ Subpackage for file conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py … effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py … filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py …

Каждый пакет в Python должен иметь файл __init__.py, который гарантирует, что этот каталог будет рассматриваться как пакет.

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

Импортировать отдельный модуль из пакета можно любым из следующих способов.

import music.formats.wavwrite

Или:

from music.formats import wavwrite

Приведенные выше операторы загружают подмодуль music.formats.wavwrite.

Предположим, в модуле wavwrite.py есть функция с именем writeFile (aFileName), которая принимает имя файла в качестве аргумента, мы называем ее, как показано ниже:

import music.formats.wavwrite … … music.formats.wavwrite.writeFile(outputFileName)

Или, по-второму:

from music.formats import wavwrite … … wavwrite.writeFile(outputFileName)

Мы можем пойти еще глубже в операторе import, где мы импортируем только ту функцию, которая нам нужна. Вот пример того, как вы можете сделать то же самое:

from music.formats.wavwrite import writeFile … … writeFile(outputFileName)

Как импортировать все модули из пакета?

А что, если писать из файла music.formats import *, как мы это делали при импорте из модуля, не было бы проще?

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

Идеальное решение – это когда автор пакета предоставляет явный индекс пакета. Если код __init__.py пакета определяет список с именем __all__, он будет рассматриваться как индекс имен модулей, которые должны быть импортированы при обнаружении from music.formats import *.

Давайте посмотрим на другой пример, чтобы лучше понять эту концепцию. Предположим, у нас есть такая структура пакета: q.

__all__ =

Тогда будут импортированы только субмодули, перечисленные в приведенном выше списке, пока обнаруживается импорт из music*.

Если __all__ не определен, оператор from music import * не будет импортировать все подмодули из пакета. Заявление от импорта music* только гарантирует, что музыкальный пакет был импортирован.

Модули и пакеты Python. Понятие модуля

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

Модуль (от англ. module ) – это отдельный файл с программным кодом на языке Python , который создается один раз и далее может быть использован программами многократно.

Для формирования модуля необходимо создать обычный текстовый файл с расширением *py и записать в него целевые программные инструкции. Название файла при этом будет представлять имя модуля, а сам модуль после создания станет доступным для использования либо в качестве независимого сценария, либо в виде расширения, подключаемого к другим модулям, позволяя тем самым связывать отдельные файлы в крупные программные системы. При этом все имена, которым будет выполнено присваивание на верхнем уровне модуля (т.е. внутри файла модуля вне функций, классов и т.д.), становятся атрибутами объекта модуля, доступными для использования клиентами в привычном нам формате mod_name.attr .

Использование модульного подхода в программировании дает ряд важных преимуществ, т.к. модули:

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

Все модули в Python можно разделить на четыре основные категории:

  • встроенные модули (от англ. bilt-in ) – представляют собой базовые возможности языка и либо импортируются интерпретатором автоматически, либо требуют лишь простого импортирования без необходимости дополнительной установки;
  • стандартная библиотека (от англ. standard library ) – обширная коллекция дополнительных модулей и пакетов, представляющих расширенные возможности языка, которая входит непосредственно в состав дистрибутива Python и также требует лишь простого импортирования ее модулей без необходимости дополнительной установки;
  • сторонние модули (от англ. 3rd party ) – более 90 000 модулей и пакетов, которые не входят в дистрибутив Python , но могут быть установлены из Python Package Index (PyPI) официального сайта с помощью утилиты pip ;
  • пользовательские модули – все модули программы, которые создаются самими разработчиками.

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

Для чего служит файл __init__.py в пакете? Модули

В Python.org glossary даётся следующее определение модуля :

Объект, который служит организационной единицей кода в Python.Модули имеют пространство имён, в котором содержатся произвольные объекты Python.Модули загружаются в Python посредством импортирования. ()

На практике модуль соответствует, как правило, одному файлу с расширением.py. В этом файле содержится код на Python.

Модули обладают сверхспособностью импортироваться и повторно использоваться в другом коде. Рассмотрим следующий пример:

import math math.pi

В первой строкеimport mathвы импортируете код в модуль math и делаете его доступным для использования. Во второй строке вы получаете доступ к переменной в модулеmath. Модульmathявляется частью стандартной библиотеки P ython , поэтому он всегда доступен для импорта, когда вы работаете с Python.

Обратите внимание, что пишется не простоpi, аmath.pi.math — это не только модуль, а ещё и пространство имён , в котором содержатся все атрибуты этого модуля. Пространства имён важны для читаемости и структурированности кода. Как сказал Тим Петерс:

Пространства имён — это отличная идея. Их должно быть больше! ( Источник .)

Содержимое пространства имён можно посмотреть с помощьюdir():

>>> import math >>> dir() >>> dir(math)

Если не указывать при этом никаких аргументов, т.е. простоdir(), то можно увидеть, что находится в глобальном пространстве имён. Посмотреть содержимое пространства имёнmathможно, указав его в качестве аргумента вот так:dir(math).

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

Вот код, который импортирует из модуляmathтолько переменнуюpi:

>>> from math import pi>>> pi3. 141592653589793 >>> math.piNameError: name 'math' is not defined

Обратите внимание, чтоpiпомещается в глобальное пространство имён, а не в пространство имёнmath.

Популярные пакеты Python. Useful Modules, Packages and Libraries

The intent of this page is to list some of the most commonly used Python modules, in the hope that it will provide useful recommendations for other programmers (especially beginners). Remember that in addition to the listings below, there are other directories of Python modules - see PublishingPythonModules for details. Another collection of library details can be found on the Libraries page.

Be warned that this list is subjective by its very nature - it is only intended as a helpful guide. It is not definitive in any way, nor should it discourage developers from developing their own modules.

Standard Library Backports

    StandardLibraryBackports - modules that make later standard library functionality available in earlier version

Cryptography

    Python and Cryptography

Database

    SQLAlchemy or SQLObject - Object oriented access to several different database systems

    DatabaseInterfaces - Direct Python interfaces to relational and non-relational database backends

    See also DatabaseProgramming for guidance on choosing a database backend system

Foreign Function Interface

    CTypes - A package for calling the functions of dlls/shared libraries. Now included with Python 2.5 and up.

    Cython is an extension language for the CPython runtime. It translates Python code to fast C code and supports calling external C and C++ code natively. As opposed to ctypes, it requires a C compiler to translate the generated code.

Game Development

    PyGame - Principal wrapper of the SDL library.

    See also GameProgramming . A more comprehensive list of packages can be found on the PythonGameLibraries page.

GIS (Geographic Information System)

    GIS Web services - Packages to access to Google Maps, Yahoo! Maps… and more information

GUI

    PyGtk - Bindings for the cross-platform Gtk toolkit.

    PyQt - Bindings for the cross-platform Qt framework.

    TkInter - The traditional Python user interface toolkit.

    WxPython - wxWidgets bindings for Python supporting PythonCard , Wax and other frameworks.

    PyjamasDesktop - Bindings and a framework for the cross-platform webkit .

    PySimpleGUI - Wrapper for TkInter , Qt, wxpython and Remi (Web) that makes GUI development easy and compact

    GUI Programming is, in many cases, a matter of taste. See a more extensive list on the GuiProgramming page.

Console

    Ascii Table packages

Audio / Music

    Audio in Python

ID3 Handling

    Mutagen - Mutagen is a Python module to handle audio metadata. It supports FLAC, M4A, Musepack, MP3, Ogg FLAC, Ogg Speex, Ogg Theora, Ogg Vorbis, True Audio, and WavPack audio files. All versions of ID3v2 are supported, and all standard ID3v2.4 frames are parsed. It can read Xing headers to accurately calculate the bitrate and length of MP3s. ID3 and APEv2 tags can be edited regardless of audio format. It can also manipulate Ogg streams on an individual packet/page level. It only writes ID3v2.4 (introduced in 2000, but as of Windows 8 still not supported by MediaPlayer ).

    ID3Reader - "Id3reader.py is a Python module that reads ID3 metadata tags in MP3 files. It can read ID3v1, ID3v2.2, ID3v2.3, or ID3v2.4 tags. It does not write tags at all" (from site). Used in ID3Writer. Does not work with Python 3000. Not maintained since 2006.

    PyID3 - ""(Appears to be inactive)""Module for manipulating ID3 informational tags in MP3 audio files. Not as good as ID3Writer, but no issues w/ genre, unlike ID3Writer. Not maintained since 2007.

    pytagger - tag reader and writer implemented purely in Python. Supports ID3v1, ID3v1.1, ID3v2.2, ID3v2.3 and ID3v2.4

    eyeD3 - is a Python module and program for processing ID3 tags. It can extract information such as bit rate, sample frequency, play time, etc. It supports ID3 v1.0/v1.1 and v2.3/v2.4.

    - Py3k - hsaudiotag is a pure Python library that lets you read metadata (bitrate, sample rate, duration and tags) from mp3, mp4, wma, ogg, flac and aiff files. It can only read tags, not write to them, but unlike more complete libraries (like Mutagen), it is BSD licensed.

    pytaglib - Python 3.x and 2.x support - bindings to the C++ taglib library, reads and writes mp3, ogg, flac, mpc, speex, opus, WavPack , TrueAudio , wav, aiff, mp4 and asf files.