Модуль 7: Модули и пакеты
В этом модуле вы изучите как организовывать код с помощью модулей и пакетов, а также управлять зависимостями в Python.
7.1 Импорт модулей
Модули в Python — это файлы с расширением .py, содержащие код, который можно повторно использовать в других программах. Использование модулей помогает организовать код и избежать конфликтов имен.
Что такое модули и зачем они нужны
Модули позволяют:
- Организовать код в логические блоки
- Повторно использовать код
- Избежать конфликтов имен переменных
- Сделать программу более поддерживаемой
Типы модулей в Python
- Встроенные модули — поставляются с Python (например,
math,os,random) - Сторонние модули — устанавливаются отдельно (например,
numpy,pandas,requests) - Пользовательские модули — созданные самим программистом
Способы импорта модулей
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 ищет модули в следующих местах:
- Текущая директория
- Список директорий в переменной среды
PYTHONPATH - Стандартные директории установки 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— работа с данными в формате JSONre— регулярные выражения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)}")
Рекомендации по импорту модулей
- Импортируйте стандартные библиотеки в начале файла
- После пустой строки импортируйте сторонние библиотеки
- После еще одной пустой строки импортируйте локальные/пользовательские модули
- Старайтесь импортировать модули в алфавитном порядке
- Избегайте импорта
*
Пример хорошей организации импортов:
# Стандартные библиотеки
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 есть несколько инструментов для создания виртуальных окружений:
venv— встроенный модуль в Python 3.3+virtualenv— сторонний пакет, поддерживает Python 2 и 3conda— менеджер пакетов и окружений, часть дистрибутива Anacondapipenv— комбинирует pip и virtualenvpoetry— современный инструмент для управления зависимостями
Создание и работа с 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"
Безопасность при установке пакетов
При установке пакетов важно соблюдать следующие меры безопасности:
- Проверяйте имена пакетов, чтобы избежать "typosquatting" (пакетов с похожими названиями)
- Используйте только проверенные и популярные пакеты
- Указывайте конкретные версии в requirements.txt
- Регулярно обновляйте пакеты для установки исправлений безопасности
Альтернативы PIP
Хотя PIP является стандартным менеджером пакетов, существуют альтернативы:
conda— особенно полезен для научных вычислений и машинного обученияpipenv— объединяет функциональность pip и virtualenvpoetry— современный инструмент управления зависимостями
Популярные пакеты для разных областей
Научные вычисления и анализ данных
numpy— многомерные массивы и математические функцииscipy— научные вычисленияpandas— анализ и обработка данныхmatplotlib— визуализация данных
Веб-разработка
django— полнофункциональный веб-фреймворкflask— микрофреймворк для веб-приложенийfastapi— современный веб-фреймворк с высокой производительностьюrequests— HTTP-клиент
Машинное обучение
scikit-learn— инструменты машинного обученияtensorflow— библиотека для глубокого обученияpytorch— альтернативная библиотека для глубокого обученияkeras— высокоуровневый API для нейронных сетей
Утилиты для разработки
pytest— тестирование кодаblack— автоматическое форматирование кодаisort— сортировка импортовflake8— проверка стиля кодаmypy— статическая типизация для Python
Полезные ресурсы
- Python Package Index (PyPI) — официальный репозиторий пакетов
- Python Packaging User Guide — руководство по упаковке Python-проектов
- Официальная документация PIP
Советы по управлению зависимостями
- Храните зависимости в системе контроля версий (requirements.txt, Pipfile, pyproject.toml)
- Периодически проверяйте наличие обновлений безопасности
- Используйте инструменты для анализа уязвимостей (например, safety, pip-audit)
- Избегайте избыточных зависимостей, которые могут увеличить поверхность атаки
- Рассмотрите возможность "заморозки" окружения в production для обеспечения стабильности