Как подключить свою созданную библиотеку на Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как подключить свою созданную библиотеку на Python
Создание и использование собственных Python библиотек — это важный навык для Data Engineer'ов при организации переиспользуемого кода. Рассмотрю несколько способов подключения библиотеки на Python.
Подход 1: Локальная разработка (развитие в режиме editable mode)
Этот подход идеален для разработки библиотеки:
Структура проекта библиотеки
my_data_library/
├── setup.py
├── pyproject.toml
├── README.md
├── requirements.txt
├── my_data_library/
│ ├── __init__.py
│ ├── etl.py
│ ├── transformations.py
│ └── utils.py
└── tests/
├── test_etl.py
└── test_transformations.py
Создание setup.py
from setuptools import setup, find_packages
setup(
name="my-data-library",
version="0.1.0",
description="Data transformation and ETL utilities",
author="Your Name",
author_email="your@email.com",
url="https://github.com/yourname/my-data-library",
packages=find_packages(),
install_requires=[
"pandas>=1.5.0",
"numpy>=1.23.0",
"pyspark>=3.3.0",
],
extras_require={
"dev": [
"pytest>=7.0",
"black>=23.0",
"pylint>=2.15.0",
]
},
python_requires=">=3.8",
)
Установка в режиме разработки (editable mode)
# Перейти в директорию библиотеки
cd my_data_library
# Установить в режиме editable (изменения в коде автоматически видны)
pip install -e .
# Или с дополнительными зависимостями для разработки
pip install -e ".[dev]"
В режиме editable любые изменения в коде сразу видны в проектах, которые используют библиотеку.
Подход 2: Использование pyproject.toml (современный стандарт)
Это более современный и гибкий подход:
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=6.2"]
build-backend = "setuptools.build_meta"
[project]
name = "my-data-library"
version = "0.2.0"
description = "Data transformation and ETL utilities"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "MIT"}
authors = [{name = "Your Name", email = "your@email.com"}]
classifiers = [
"Development Status :: 3 - Alpha",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
]
dependencies = [
"pandas>=1.5.0",
"numpy>=1.23.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"black>=23.0",
"pylint>=2.15.0",
]
spark = [
"pyspark>=3.3.0",
]
[project.urls]
Repository = "https://github.com/yourname/my-data-library"
Установка:
pip install -e .
pip install -e ".[dev,spark]" # С опциональными зависимостями
Подход 3: Использование локального пути напрямую
Для быстрого тестирования (не рекомендуется для production):
# В начале Python скрипта или Jupyter notebook
import sys
sys.path.insert(0, '/path/to/my_data_library')
import my_data_library as mdl
Это плохая практика, так как:
- Зависит от абсолютного пути
- Не работает на других машинах
- Не управляет зависимостями
Подход 4: Использование через pip install с git
Если библиотека в GitHub:
# Установка с главной ветки
pip install git+https://github.com/yourname/my-data-library.git
# Установка с конкретной ветки
pip install git+https://github.com/yourname/my-data-library.git@development
# Установка с конкретного коммита
pip install git+https://github.com/yourname/my-data-library.git@abc123
# Установка в режиме editable с git
pip install -e git+https://github.com/yourname/my-data-library.git#egg=my-data-library
Подход 5: Публикация на PyPI и установка из пакета
Для распространения библиотеки всем:
Сборка пакета
# Установить build инструменты
pip install build twine
# Собрать пакет (создаст папку dist/)
python -m build
# Проверить содержимое пакета
twine check dist/*
Загрузка на PyPI
# На тестовый PyPI для проверки
twine upload --repository testpypi dist/*
# На настоящий PyPI
twine upload dist/*
Установка после публикации
pip install my-data-library
pip install my-data-library==0.2.0 # Конкретная версия
Подход 6: Использование в требованиях (requirements.txt)
Если вы используете несколько локальных библиотек:
# requirements.txt
pandas>=1.5.0
numpy>=1.23.0
# Локальная библиотека из git
git+https://github.com/yourname/my-data-library.git@v0.2.0#egg=my-data-library
# Локальная библиотека с локального пути
-e /path/to/my_data_library
# Локальная библиотека с другого пути (относительный путь)
-e ../other_project/my_library
Установка:
pip install -r requirements.txt
Пример структуры самой библиотеки
# my_data_library/__init__.py
"""Data transformation and ETL utilities"""
__version__ = "0.2.0"
__author__ = "Your Name"
from .etl import extract, load, transform
from .transformations import (
clean_nulls,
normalize_columns,
deduplicate,
)
from .utils import log_execution_time
__all__ = [
"extract",
"load",
"transform",
"clean_nulls",
"normalize_columns",
"deduplicate",
"log_execution_time",
]
# my_data_library/etl.py
from typing import Dict, List
import logging
logger = logging.getLogger(__name__)
def extract(source: str, query: str) -> Dict:
"""Extract data from source system"""
logger.info(f"Extracting from {source}")
# Реализация
pass
def transform(data: Dict) -> Dict:
"""Transform raw data"""
logger.info("Transforming data")
# Реализация
pass
def load(data: Dict, target: str) -> None:
"""Load data to target system"""
logger.info(f"Loading to {target}")
# Реализация
pass
Использование в проекте
# my_project/main.py
from my_data_library import extract, transform, load
import logging
logging.basicConfig(level=logging.INFO)
def main():
# Извлечение
data = extract(
source="postgresql://localhost:5432/mydb",
query="SELECT * FROM users"
)
# Трансформация
transformed = transform(data)
# Загрузка
load(
data=transformed,
target="postgresql://localhost:5432/warehouse"
)
print("ETL pipeline completed successfully")
if __name__ == "__main__":
main()
Лучшие практики
-
Используйте версионирование (semver): 0.1.0 — major.minor.patch
-
Документируйте код: docstrings для всех публичных функций
def transform(data: pd.DataFrame) -> pd.DataFrame:
"""Transform DataFrame by removing nulls and normalizing columns.
Args:
data: Input DataFrame to transform
Returns:
Transformed DataFrame
Raises:
ValueError: If DataFrame is empty
"""
if data.empty:
raise ValueError("Input DataFrame cannot be empty")
# Реализация
pass
-
Тестируйте: используйте pytest и убедитесь, что тесты проходят
-
Управляйте зависимостями: указывайте версии зависимостей точно
-
Используйте editable mode во время разработки: это ускорит цикл разработки
-
Отделите опциональные зависимости: не все нужны для базового использования
Типичные проблемы
Проблема: Изменения в библиотеке не видны
Решение: Используйте pip install -e . или перезагрузите Python интерпретатор
Проблема: Конфликты версий зависимостей Решение: Используйте виртуальное окружение и фиксируйте версии в requirements.txt
Проблема: "No module named my_data_library"
Решение: Проверьте, что библиотека установлена (pip list) и PYTHONPATH правильный
Создание и использование собственных библиотек критично для масштабируемости и переиспользуемости кода в Data Engineering проектах.