Python

Модуль 7: Модули и пакеты

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

7.1 Импорт модулей

Модули в Python — это файлы с расширением .py, содержащие код, который можно повторно использовать в других программах. Использование модулей помогает организовать код и избежать конфликтов имен.

Что такое модули и зачем они нужны

Модули позволяют:

  • Организовать код в логические блоки
  • Повторно использовать код
  • Избежать конфликтов имен переменных
  • Сделать программу более поддерживаемой

Типы модулей в Python

  1. Встроенные модули — поставляются с Python (например, math, os, random)
  2. Сторонние модули — устанавливаются отдельно (например, numpy, pandas, requests)
  3. Пользовательские модули — созданные самим программистом

Способы импорта модулей

1. Простой импорт

import math

# Использование функций модуля с указанием имени модуля
radius = 5
area = math.pi * math.pow(radius, 2)
print(f"Площадь круга: {area}")

2. Импорт с псевдонимом (alias)

import numpy as np
import pandas as pd

# Использование сокращённых имён
data = np.array([1, 2, 3, 4, 5])
mean_value = np.mean(data)
print(f"Среднее значение: {mean_value}")

3. Импорт отдельных функций или классов

from math import pi, sqrt

# Прямое использование функций без указания имени модуля
radius = 5
area = pi * (radius ** 2)
circumference = 2 * pi * radius
print(f"Площадь круга: {area}")
print(f"Длина окружности: {circumference}")
print(f"Квадратный корень из 16: {sqrt(16)}")

4. Импорт всех функций и классов

from math import *

# Все функции модуля доступны напрямую
print(f"Число Пи: {pi}")
print(f"Синус 90 градусов: {sin(radians(90))}")
print(f"Косинус 0 градусов: {cos(radians(0))}")

Совет

Импорт всех функций модуля с помощью from module import * обычно не рекомендуется, так как это может привести к конфликтам имен и затруднить понимание кода. Лучше явно импортировать только нужные функции или использовать псевдонимы.

Создание собственных модулей

Создание пользовательского модуля очень просто. Достаточно написать код в Python-файле и сохранить его с расширением .py.

Например, создадим модуль my_math.py с некоторыми математическими функциями:

# Файл: my_math.py

def add(a, b):
    """Функция сложения двух чисел"""
    return a + b

def subtract(a, b):
    """Функция вычитания двух чисел"""
    return a - b

def multiply(a, b):
    """Функция умножения двух чисел"""
    return a * b

def divide(a, b):
    """Функция деления двух чисел"""
    if b == 0:
        raise ValueError("Деление на ноль недопустимо")
    return a / b

# Константы
PI = 3.14159
E = 2.71828

Теперь мы можем использовать этот модуль в другом файле:

# Файл: calculator.py
import my_math

print(f"Сложение: {my_math.add(10, 5)}")
print(f"Вычитание: {my_math.subtract(10, 5)}")
print(f"Умножение: {my_math.multiply(10, 5)}")
print(f"Деление: {my_math.divide(10, 5)}")
print(f"Значение Пи: {my_math.PI}")

Переменная __name__

Python устанавливает переменную __name__ для каждого модуля. Если файл запускается напрямую, значение __name__ равно "__main__". Если файл импортируется, значение __name__ будет равно имени модуля.

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

# Файл: my_math.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# Код ниже выполнится только если файл запущен напрямую
if __name__ == "__main__":
    print("Тестирование модуля my_math")
    print(f"Сложение 5 и 3: {add(5, 3)}")
    print(f"Вычитание 10 и 4: {subtract(10, 4)}")

Поиск модулей. Путь поиска

Python ищет модули в следующих местах:

  1. Текущая директория
  2. Список директорий в переменной среды PYTHONPATH
  3. Стандартные директории установки Python

Вы можете проверить текущий путь поиска модулей с помощью переменной sys.path:

import sys

print("Пути поиска модулей:")
for path in sys.path:
    print(path)

Пакеты в Python

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

Пример структуры пакета:

my_package/
|-- __init__.py
|-- module1.py
|-- module2.py
|-- subpackage/
    |-- __init__.py
    |-- module3.py
    |-- module4.py

Импорт из пакетов:

# Импорт модуля из пакета
import my_package.module1

# Импорт функции из модуля в пакете
from my_package.module2 import some_function

# Импорт модуля из подпакета
import my_package.subpackage.module3

# Импорт функции из модуля в подпакете
from my_package.subpackage.module4 import another_function

Зачем нужен файл __init__.py

Файл __init__.py нужен, чтобы Python распознавал директорию как пакет. В Python 3.3+ этот файл не обязателен (неявные пространства имен), но его использование по-прежнему рекомендуется для совместимости и инициализации пакета.

В файле __init__.py вы можете указать, какие модули или функции должны быть экспортированы при импорте пакета:

# Файл: my_package/__init__.py
from .module1 import function1
from .module2 import function2

__all__ = ['function1', 'function2']

Относительные импорты

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

# Файл: my_package/module2.py

# Относительный импорт из соседнего модуля
from .module1 import function1

# Относительный импорт из родительского пакета
from .. import some_module

# Относительный импорт из подпакета
from .subpackage import module3

Полезные встроенные модули

Python поставляется с множеством полезных модулей:

  • os — работа с операционной системой
  • sys — системные функции и параметры
  • datetime — работа с датами и временем
  • math — математические функции
  • random — генератор случайных чисел
  • json — работа с данными в формате JSON
  • re — регулярные выражения
  • collections — специализированные типы данных
  • itertools — функции для работы с итерируемыми объектами
import os
import sys
import datetime
import random

# Получение текущей директории
print(f"Текущая директория: {os.getcwd()}")

# Информация о версии Python
print(f"Версия Python: {sys.version}")

# Текущая дата и время
now = datetime.datetime.now()
print(f"Текущая дата и время: {now}")

# Случайное целое число от 1 до 100
print(f"Случайное число: {random.randint(1, 100)}")

Рекомендации по импорту модулей

  1. Импортируйте стандартные библиотеки в начале файла
  2. После пустой строки импортируйте сторонние библиотеки
  3. После еще одной пустой строки импортируйте локальные/пользовательские модули
  4. Старайтесь импортировать модули в алфавитном порядке
  5. Избегайте импорта *

Пример хорошей организации импортов:

# Стандартные библиотеки
import datetime
import os
import sys

# Сторонние библиотеки
import numpy as np
import pandas as pd
import requests

# Локальные/пользовательские модули
import config
from my_package import helper
from utils.formatting import format_text

7.2 Виртуальные окружения

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

Зачем нужны виртуальные окружения?

Представьте, что у вас есть два проекта: один требует Django 2.0, а другой — Django 3.0. Без виртуальных окружений вы не сможете одновременно работать с обоими проектами, так как в системе может быть установлена только одна версия пакета.

Виртуальные окружения решают следующие проблемы:

  • Конфликты версий пакетов между проектами
  • Зависимость от системных пакетов
  • Необходимость прав администратора для установки пакетов
  • Сложность в воспроизведении окружения разработки

Инструменты для создания виртуальных окружений

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

  1. venv — встроенный модуль в Python 3.3+
  2. virtualenv — сторонний пакет, поддерживает Python 2 и 3
  3. conda — менеджер пакетов и окружений, часть дистрибутива Anaconda
  4. pipenv — комбинирует pip и virtualenv
  5. poetry — современный инструмент для управления зависимостями

Создание и работа с venv (встроенный модуль)

Создание виртуального окружения

# Windows
python -m venv myenv

# Linux/macOS
python3 -m venv myenv

Это создаст новую директорию myenv со структурой виртуального окружения.

Активация виртуального окружения

# Windows (командная строка)
myenv\Scripts\activate.bat

# Windows (PowerShell)
myenv\Scripts\Activate.ps1

# Linux/macOS
source myenv/bin/activate

После активации командная строка обычно показывает имя активного окружения:

(myenv) C:\Projects\my_project>

Установка пакетов в виртуальное окружение

# Установка конкретного пакета
pip install requests

# Установка конкретной версии
pip install django==3.2.5

Просмотр установленных пакетов

pip list
pip freeze

Деактивация виртуального окружения

deactivate

Использование virtualenv (для Python 2 и 3)

virtualenv — это сторонний инструмент, который нужно установить отдельно:

pip install virtualenv

Создание окружения с помощью virtualenv

# Создание окружения
virtualenv myenv

# Создание окружения с указанием версии Python
virtualenv -p python3.8 myenv

Активация и деактивация выполняются так же, как и для venv.

Управление зависимостями проекта

Чтобы другие разработчики могли воссоздать ваше окружение, можно сохранить список установленных пакетов в файл requirements.txt:

# Сохранение списка пакетов
pip freeze > requirements.txt

# Установка пакетов из файла
pip install -r requirements.txt

Содержимое файла requirements.txt может выглядеть так:

django==3.2.5
requests==2.26.0
numpy==1.21.0
pandas==1.3.0
python-dotenv==0.19.0

Современные инструменты управления зависимостями

Pipenv

Pipenv объединяет pip, virtualenv и управление файлом зависимостей в единый инструмент:

# Установка Pipenv
pip install pipenv

# Создание окружения и установка пакета
pipenv install requests

# Установка пакета только для разработки
pipenv install pytest --dev

# Активация окружения
pipenv shell

Pipenv создает два файла:

  • Pipfile — содержит информацию о зависимостях
  • Pipfile.lock — содержит точные версии всех установленных пакетов и их зависимостей

Poetry

Poetry — современный инструмент для управления зависимостями Python и упаковки проектов:

# Установка Poetry
pip install poetry

# Создание нового проекта
poetry new my-project

# Инициализация Poetry в существующем проекте
cd existing-project
poetry init

# Добавление зависимостей
poetry add requests

# Добавление зависимостей для разработки
poetry add pytest --dev

# Активация окружения
poetry shell

Poetry использует файл pyproject.toml для управления зависимостями и метаданными проекта.

Изоляция виртуальных окружений

По умолчанию, виртуальные окружения создаются внутри проекта. Однако вы можете хранить их в централизованном месте:

Для venv и virtualenv

Просто указывайте полный путь при создании:

# Windows
python -m venv C:\Users\username\.virtualenvs\myproject

# Linux/macOS
python3 -m venv ~/.virtualenvs/myproject

Для Pipenv

По умолчанию Pipenv хранит все окружения в централизованной локации:

# Windows
%USERPROFILE%\.virtualenvs\

# Linux/macOS
~/.local/share/virtualenvs/

Рекомендации по работе с виртуальными окружениями

  • Создавайте отдельное виртуальное окружение для каждого проекта
  • Всегда включайте requirements.txt (или эквивалент) в репозиторий проекта
  • Не добавляйте саму директорию виртуального окружения в систему контроля версий (добавьте в .gitignore)
  • Периодически обновляйте пакеты в виртуальном окружении для установки исправлений безопасности
  • Если вы работаете в команде, используйте один инструмент управления окружениями на всех проектах

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

Инструмент Когда использовать
venv Простые проекты, только Python 3
virtualenv Если нужна поддержка Python 2
pipenv Средние проекты с чёткими зависимостями
poetry Сложные проекты, упаковка библиотек
conda Научные вычисления, машинное обучение

Интеграция с IDE

Современные IDE, такие как PyCharm, VS Code и другие, имеют встроенную поддержку виртуальных окружений:

PyCharm

File → Settings → Project → Python Interpreter → Add → Выберите существующее или создайте новое виртуальное окружение

VS Code

Нажмите CTRL+SHIFT+P (или CMD+SHIFT+P на macOS) → Python: Select Interpreter → Выберите или создайте окружение

Отладка проблем с виртуальными окружениями

  • Убедитесь, что окружение активировано (проверьте приглашение командной строки)
  • Проверьте путь к Python с помощью which python (Linux/macOS) или where python (Windows)
  • Проверьте установленные пакеты с помощью pip list
  • Если модуль не найден, убедитесь, что он установлен в активное виртуальное окружение

7.3 PIP и установка пакетов

PIP (Package Installer for Python) — это стандартный менеджер пакетов для Python, который позволяет устанавливать и управлять сторонними библиотеками и зависимостями, не входящими в стандартную библиотеку Python.

Что такое PyPI

PyPI (Python Package Index) — это официальный репозиторий сторонних пакетов Python. Сейчас там размещено более 350 000 пакетов для различных задач: от веб-разработки до машинного обучения.

Вы можете просмотреть доступные пакеты на официальном сайте PyPI.

Установка PIP

В современных версиях Python (2.7.9+ и 3.4+) PIP устанавливается автоматически. Если по какой-то причине он отсутствует, его можно установить вручную:

# Скачивание скрипта установки
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# Установка PIP
python get-pip.py

Проверка версии PIP

pip --version

Основные команды PIP

Установка пакетов

# Установка последней версии пакета
pip install package_name

# Установка конкретной версии
pip install package_name==1.2.3

# Установка минимальной версии
pip install package_name>=1.2.3

# Установка пакета из Git-репозитория
pip install git+https://github.com/user/repo.git

# Установка из локального архива
pip install ./downloads/package-1.2.3.tar.gz

# Установка в режиме разработки (editable mode)
pip install -e .

Обновление пакетов

# Обновление одного пакета
pip install --upgrade package_name

# Обновление PIP
pip install --upgrade pip

Удаление пакетов

pip uninstall package_name

Список установленных пакетов

# Вывод всех установленных пакетов
pip list

# Вывод в формате requirements.txt
pip freeze

Поиск пакетов

pip search query_term

Информация о пакете

pip show package_name

Работа с файлом requirements.txt

Файл requirements.txt — это стандартный способ определения зависимостей Python-проекта:

# Создание файла requirements.txt со списком установленных пакетов
pip freeze > requirements.txt

# Установка пакетов из файла requirements.txt
pip install -r requirements.txt

Пример содержимого файла requirements.txt:

# Веб-фреймворк
Django==3.2.6

# HTTP-клиент
requests==2.26.0

# Для работы с данными
numpy>=1.20.0
pandas>=1.3.0

# Для работы с окружением
python-dotenv==0.19.0

Установка пакетов из разных источников

PIP может устанавливать пакеты из различных источников:

# Из PyPI (по умолчанию)
pip install package_name

# Из альтернативного индекса пакетов
pip install --index-url https://alternative-pypi.org/simple/ package_name

# Из Git-репозитория
pip install git+https://github.com/user/repo.git

# Из определенной ветки Git-репозитория
pip install git+https://github.com/user/repo.git@branch_name

# Из локальной директории
pip install -e /path/to/package/

# Из колеса (wheel)
pip install package-1.0.0-py3-none-any.whl

Создание собственных пакетов

Для создания собственных пакетов вам потребуется настроить структуру проекта и создать файл setup.py:

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

my_package/
|-- setup.py
|-- README.md
|-- LICENSE
|-- my_package/
    |-- __init__.py
    |-- module1.py
    |-- module2.py
    |-- subpackage/
        |-- __init__.py
        |-- module3.py

Пример файла setup.py

from setuptools import setup, find_packages

setup(
    name="my-package",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "requests>=2.25.0",
        "numpy>=1.20.0",
    ],
    author="Ваше Имя",
    author_email="your.email@example.com",
    description="Краткое описание пакета",
    long_description=open("README.md").read(),
    long_description_content_type="text/markdown",
    url="https://github.com/username/my-package",
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires=">=3.6",
)

Сборка и публикация пакета

# Установка инструментов для сборки
pip install setuptools wheel twine

# Сборка пакета
python setup.py sdist bdist_wheel

# Публикация пакета на PyPI
twine upload dist/*

Современные стандарты упаковки

Современный стандарт упаковки Python-проектов использует файл pyproject.toml вместо setup.py:

[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "my-package"
version = "0.1.0"
description = "Краткое описание пакета"
readme = "README.md"
authors = [
    {name = "Ваше Имя", email = "your.email@example.com"},
]
license = {text = "MIT"}
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]
requires-python = ">=3.6"
dependencies = [
    "requests>=2.25.0",
    "numpy>=1.20.0",
]

[project.urls]
Homepage = "https://github.com/username/my-package"
"Bug Tracker" = "https://github.com/username/my-package/issues"

Безопасность при установке пакетов

При установке пакетов важно соблюдать следующие меры безопасности:

  1. Проверяйте имена пакетов, чтобы избежать "typosquatting" (пакетов с похожими названиями)
  2. Используйте только проверенные и популярные пакеты
  3. Указывайте конкретные версии в requirements.txt
  4. Регулярно обновляйте пакеты для установки исправлений безопасности

Альтернативы PIP

Хотя PIP является стандартным менеджером пакетов, существуют альтернативы:

  • conda — особенно полезен для научных вычислений и машинного обучения
  • pipenv — объединяет функциональность pip и virtualenv
  • poetry — современный инструмент управления зависимостями

Популярные пакеты для разных областей

Научные вычисления и анализ данных

  • numpy — многомерные массивы и математические функции
  • scipy — научные вычисления
  • pandas — анализ и обработка данных
  • matplotlib — визуализация данных

Веб-разработка

  • django — полнофункциональный веб-фреймворк
  • flask — микрофреймворк для веб-приложений
  • fastapi — современный веб-фреймворк с высокой производительностью
  • requests — HTTP-клиент

Машинное обучение

  • scikit-learn — инструменты машинного обучения
  • tensorflow — библиотека для глубокого обучения
  • pytorch — альтернативная библиотека для глубокого обучения
  • keras — высокоуровневый API для нейронных сетей

Утилиты для разработки

  • pytest — тестирование кода
  • black — автоматическое форматирование кода
  • isort — сортировка импортов
  • flake8 — проверка стиля кода
  • mypy — статическая типизация для Python

Полезные ресурсы

Советы по управлению зависимостями

  • Храните зависимости в системе контроля версий (requirements.txt, Pipfile, pyproject.toml)
  • Периодически проверяйте наличие обновлений безопасности
  • Используйте инструменты для анализа уязвимостей (например, safety, pip-audit)
  • Избегайте избыточных зависимостей, которые могут увеличить поверхность атаки
  • Рассмотрите возможность "заморозки" окружения в production для обеспечения стабильности

Настройки

Цветовая схема

Тема