← Назад к вопросам

Как подключить свою созданную библиотеку на Python?

1.0 Junior🔥 171 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как подключить свою созданную библиотеку на 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()

Лучшие практики

  1. Используйте версионирование (semver): 0.1.0 — major.minor.patch

  2. Документируйте код: 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
  1. Тестируйте: используйте pytest и убедитесь, что тесты проходят

  2. Управляйте зависимостями: указывайте версии зависимостей точно

  3. Используйте editable mode во время разработки: это ускорит цикл разработки

  4. Отделите опциональные зависимости: не все нужны для базового использования

Типичные проблемы

Проблема: Изменения в библиотеке не видны Решение: Используйте pip install -e . или перезагрузите Python интерпретатор

Проблема: Конфликты версий зависимостей Решение: Используйте виртуальное окружение и фиксируйте версии в requirements.txt

Проблема: "No module named my_data_library" Решение: Проверьте, что библиотека установлена (pip list) и PYTHONPATH правильный

Создание и использование собственных библиотек критично для масштабируемости и переиспользуемости кода в Data Engineering проектах.

Как подключить свою созданную библиотеку на Python? | PrepBro