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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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


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


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


foo
    __pypackages__
        3.8
            lib
                bottle
    myscript.py

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


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


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


Установка почти не отличается от обычной установки пакетов с помощью 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 функционала уже сейчас.

Источник: https://habr.com/ru/post/444504/


Интересные статьи

Интересные статьи

«За что я плачу тебе деньги?» — обычный вопрос работодателя работнику, причем саркастический, как правило. «За что я тут корячусь на тебя?» — столь же обычный вопрос работника к работо...
Если несколько элементов веб-страницы расположены близко друг к другу, то у пользователей возникает такое ощущение, что у этих элементов есть что-то общее. Группировка элементов помогает пользова...
Продолжаем обзор замечательной тулы для разработки под Windows и не только, Azure DevOps. На этот раз, намучавшись с переменными окружения я решил вынести весь опыт в одну статью. Начиная от того...
Ранее в одном из наших КП добавление задач обрабатывалось бизнес-процессами, сейчас задач стало столько, что бизнес-процессы стали неуместны, и понадобился инструмент для массовой заливки задач на КП.
Эта статья посвящена одному из способов сделать в 1с-Битрикс форму в всплывающем окне. Достоинства метода: - можно использовать любые формы 1с-Битрикс, которые выводятся компонентом. Например, добавле...