Модуль 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 для обеспечения стабильности
Поздравляем!
Вы прошли модуль "Модули и пакеты" в Python. Теперь вы знаете, как организовывать код с помощью модулей, работать с виртуальными окружениями и управлять зависимостями проекта!