Хабрахабр

[Из песочницы] Использование локальной директории с пакетами в Python уже сейчас

8 предлагается добавить альтернативу виртуальным окружениям — локальную директорию с пакетами PEP 582 Python local packages directory. В Python 3.

Директория __pypackages__ будет иметь больший приоритет при импорте, чем глобальные или пользовательские директории с пакетами. Данный PEP предлагает добавить в Python механизм автоматического обнаружения директории __pypackages__ и использовать её при импорте в качестве источника установленных пакетов. Это позволит исключить создание, активацию или деактивацию виртуальных окружений.

8 структура пакета с использованием __pypackages__ : Вот так будет выглядеть в Python 3.

foo __pypackages__ 3.8 lib bottle myscript.py

8. В статье я расскажу как использовать локальную директорию с пакетами не дожидаясь выхода Python 3.

5. В статье описан базовый пример, проверенный в Linux, Python 3. Для других платформ, возможно, понадобится внести изменения.

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

В ней указываем полный или относительный путь до директории с локальными пакетами. Установка почти не отличается от обычной установки пакетов с помощью pip, за исключением дополнительной опции --target.

pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar

$PWD — переменная с текущей рабочей директорией.

Будет создано следующее дерево директорий:

foo __pypackages__ 3.5 lib bar myscript.py

Версию Python и вложенные директории приходиться указывать вручную.

У меня таких пакетов не было, но как решение можно добавить еще архитектуру в структуру директорий. Так же могут возникнуть проблемы, если нужно установить пакеты с бинарным кодом и под разные архитектуры.

Еще один вариант установки

Есть еще один способ установки пакетов в конкретную директорию :

pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar

Но нужно обязательно указывать полный путь до места установки и дерево директорий будет отличаться от предложенной в PEP 582:

foo __pypackages__ lib python3.5 site-packages bar myscript.py

Использование локальной директории с пакетами

После установки пакетов осталось указать интерпретатору где искать зависимости.

Добавить путь достаточно в главный (загружаемый первым) модуль, в остальные добавлять не обязательно. Для этого нужно внести в список sys.path путь до локальной директории с пакетами. После этого можно импортировать установленные локально пакеты.

import os
import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar

Единственное условие — главный модуль должен быть на том же уровне вложенности, что и директория __pypackages__ .

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

PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py

Таким нехитрым способом можно добиться схожего с PEP 582 функционала уже сейчас.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть