Перейти к содержимому

Как создать venv python

  • автор:

Виртуальное окружение

Представь, что у тебя два проекта. Для одного требуется Джанго версии 1.6, а для другого – 1.10. Установленной можно иметь только одну версию пакета.

Пришлось бы каждый раз при переключении между этими проектами удалять одну версию пакета и устанавливать другую. Это неудобно и раздражает. А если таких пакетов много, то терпеть подобное совершенно невозможно.

virtualenv

Решение в установке всех пакетов для каждого проекта отдельно. Модули можно устанавливать не глобально, а в отдельную кучку для каждого проекта.

Такая кучка называется виртуальным окружением.

Умение пользоваться виртуальным окружением – мастхев, без него даже на Девмане будет неуютно.

Прочитай про виртуальные окружения из “Автостопом по Питону”. Там всё, что надо знать про virtualenv.

$ virtualenv название_папки_виртуального_окружения $ source название_папки_виртуального_окружения/bin/activate 

virtualenvwrapper

Виртуальное окружение – удобная штука, но добавляет пару действий: при переключении к другому проекту в него нужно зайти, вспомнить, где живёт окружение и активировать его.

Тут помогает virtualenvwrapper: он привносит структуру и порядок в работу с виртуальными окружениями.

Как установить и пользоваться написано по ссылке выше.

venv

Стандартное решение для создания виртуальных окружений в Питоне версии 3.3 и старше. Различия с virtualenv минимальны. Ссылка на документацию.

  • Идет в комплекте с Питоном3.
  • Считается решением по умолчанию, а значит, меньше проблем с совместимостью.
  • Создаёт framework-build Питона вместо обыкновенного для OSX. Такой билд необходим для правильной работы некоторых библиотек, к примеру, matplotlib и pyplot. Подробнее об этом можно почитать здесь.
  • Нет надстроек, написанных для virtualenv .

Как создать виртуальное окружение:

$ python3 -m venv --copies /полный/путь/до/папки/виртуального/окружения $ # --copies активирует копирование файлов вместо создания symlinks. С последними не дружит PyCharm. $ # в Ubuntu доступна также короткая запись — alias pyvenv $ pyvenv папка/для/виртуального/окружения 

Если удобного псевдонима в ОС нет, то его можно создать самостоятельно. Добавь себе в .bashrc (для Linux) или в .bash_profile (для Маков) строку:

pyvenv()  /usr/local/bin/python3 -m venv --copies ./$1; > 

Бонус для маководов

Если у тебя Макось, то в качестве оболочки терминала рекомендую iTerm2. Он умеет много полезного по сравнению с обычным терминалом.

Например, можно повесить на горячую клавишу создание нового окна и активацию виртуального окруженения.

У меня так: нажимаю ⌃⌘D – и я уже в папке Девмана с активированным окружением. Красота!

Это делается в настройках, вкладке Profiles. Вот как у меня:

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Как создать виртуальную среду Python

Если вы похожи на меня и у вас есть десятки различных проектов Python, управление правильными пакетами, библиотеками и версиями и их поддержка могут стать настоящей проблемой. Зависимости одного проекта могут отличаться от другого, или определенные версии библиотек могут не подходить для конкретной кодовой базы. Использование виртуальных сред — отличный способ организовать ваши проекты и отделить их друг от друга. Они используются по разным причинам: от изоляции зависимостей вашего проекта до обеспечения согласованности версий пакетов и создания отдельных сред для подготовки и производства.

В этом руководстве мы будем создавать виртуальную среду для простого проекта Python. Мы будем использовать модуль venv , который включен в Python 3.6 и выше. Если вы используете более раннюю версию Python, можно использовать модуль virtualenv .

Установка venv

venv должен быть установлен по умолчанию с Python 3.6 или выше, но если он не установлен, вы можете сделать это с помощью команды:

pip install venv 

Создание виртуальной среды

После установки вы можете создать виртуальную среду с помощью команды:

python -m venv env_name 

Здесь env_name имя папки виртуальной среды — это может быть любое имя, которое вы хотите. После запуска этой команды вы увидите, что папка создана env_name .

Этот каталог содержит все необходимые файлы и папки для запуска вашей виртуальной среды. Самый важный файл — это файл env.py , содержащий конфигурацию вашей виртуальной среды. Внутри папки env_name вы также найдете копию интерпретатора Python, а также исполняемые файлы pip и setuptools.

Активация виртуальной среды

Следующим шагом будет активация виртуальной среды. В зависимости от вашей ОС и используемого интерфейса командной строки имена каталогов могут немного отличаться. Чтобы активировать виртуальную среду в Linux, выполните следующую команду:

source env_name/bin/activate 

Если вы используете Windows CMD, вам нужно будет изменить команду на:

source env_name/Scripts/activate 

Как только виртуальная среда активна, вы сможете увидеть имя над командной строкой или проверив переменную среды VIRTUAL_ENV с помощью:

echo $VIRTUAL_ENV 

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

pip freeze 

Этот список распечатываемых библиотек и версий специфичен для этой виртуальной среды. Преимущество заключается в том, что вы можете использовать разные версии для проекта без необходимости менять версию пакета для каждой другой версии, что может вызвать проблемы.

Вы также можете деактивировать виртуальную среду после завершения, просто запустив deactivate из любого места в каталоге.

Выводы

Виртуальные среды — это важные инструменты для изоляции зависимостей вашего проекта друг от друга. Имея отдельные установки пакетов и двоичных файлов, каждый проект стоит сам по себе, и вы избежите поломки одного проекта обновлениями из другого.

Как создать виртуальное окружение в Python

Python предлагает широкий спектр возможностей и имеет множество вариантов для применения. Благодаря своей простоте, читаемости и мощной экосистеме он стал одним из самых популярных языков программирования в мире.

Python используется в таких сферах, как:

  • веб-разработка (для создания веб-приложений и веб-серверов),
  • анализ данных и машинное обучение,
  • автоматизация задач (позволяет легко создавать скрипты для автоматизации различных процессов),
  • игровая разработка,
  • создание настольных приложений.

Что такое виртуальное окружение Python

Виртуальное окружение Python (Python virtual environment) – это инструмент, позволяющий создавать изолированные среды для выполнения и разработки приложений на языке Python.

С помощью виртуального окружения Python можно установить и использовать различные версии пакетов и зависимостей для каждого проекта, изолируя их друг от друга и предотвращая конфликты или несовместимости.

Используя виртуальное окружение Python, вы получаете:

  1. Изоляцию зависимостей. Каждое виртуальное окружение имеет собственный независимый набор зависимостей и пакетов, что позволяет избежать конфликты между различными версиями пакетов.
  2. Управление версиями Python. Вы можете создавать и использовать различные версии Python в разных виртуальных окружениях, переключаясь между версиями, а также тестируя совместимость кода с новыми версиями Python.
  3. Чистоту проекта. Виртуальное окружение помогает поддерживать проект организованным, так как все зависимости и пакеты проекта хранятся в отдельной директории. Это упрощает управление и развертывание проектов.
  4. Переносимость. Вы можете передать виртуальное окружение на другую машину или другим разработчикам, что позволяет вести совместную работу над проектом.

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

Услуга VPS/VDS хостинг на Linux подойдет для проектов любой сложности:

  • разработка приложений,
  • создание почтового сервера,
  • размещение интернет-магазина,
  • развертывание продуктов 1С,
  • размещение CRM-систем.

Создание виртуальной среды Python

Процесс настройки виртуального окружения Python — это создание изолированной среды для разработки и выполнения проектов. Виртуальная среда позволяет вам установить и управлять зависимостями в проекте, не влияя на другие проекты или систему в целом.

Для создания виртуального окружения в Python рекомендуем использовать встроенный модуль venv. Если вы используете версию Python 3.3 или выше, то модуль venv уже включен в стандартную библиотеку и его установка не требуется. Для установки модуля в более ранних версиях Python выполните команду:

pip install virtualenv

Далее следуйте инструкции:

  1. Откройте командную строку и перейдите в каталог, в котором будет создана виртуальная среда.
  2. Выполните команду:

python -m venv virt_name

где virt_name – имя вашей виртуальной среды.

  1. Дождитесь завершения процесса создания виртуальной среды. Это может занять некоторое время.
  2. Ваша виртуальная среда будет создана в папке virt_name. В ней же будут находиться все файлы и зависимости, связанные с виртуальной средой.

Активация виртуальной среды Python

Процесс активации виртуальной среды может быть выполнена различными способами в зависимости от используемой операционной системы и инструментов виртуализации.

Активируйте виртуальное окружение с помощью команд:

  • Для Windows: .\Scripts\activate
  • Для macOS и Linux: source bin/activate

При успешной активации на экране отобразится:

Теперь вы находитесь в активированной виртуальной среде Python.

Если вы используете инструмент управления пакетами, такой как pipenv или poetry, вы можете создать и активировать виртуальную среду одной командой.

  • Для pipenv: pipenv shell
  • Для poetry: poetry shell

Активация виртуальной среды Python позволяет изолировать установленные пакеты и зависимости для конкретного проекта, предотвращает конфликты версий и обеспечивает чистую среду разработки. После активации вы можете устанавливать и запускать пакеты Python внутри виртуальной среды без влияния на другие проекты или глобальную установку Python.

Автоматическая активация виртуальной среды Python

Для включения автоматической активации виртуальной среды при открытии терминала или командной строки, вам потребуется внести следующие изменения в файл конфигурации вашей оболочки (например, .bashrc для Bash или .zshrc для Zsh).

Приведем пример для оболочки Bash:

  1. Откройте файл конфигурации в текстовом редакторе и введите в терминале:
  1. В конце файла добавьте следующую строку, указывающую на активацию вашей виртуальной среды:

Замените /path/to/your/virtual/environment на путь к вашей виртуальной среде Python (например, /home/user/virt_name).

  1. Сохраните изменения и закройте файл конфигурации.
  2. Обновите текущую сессию оболочки, чтобы изменения вступили в силу:

Замените `~/.bashrc` на путь к вашему файлу конфигурации, если он отличается.

Теперь при открытии нового терминала или командной строки ваша виртуальная среда Python будет автоматически активирована. Это позволит использовать установленные в этой среде библиотеки и исполнять команды Python без необходимости активации вручную.

Деактивация виртуального окружения Python

Для деактивации виртуального окружения можно использовать следующую команду в терминале: deactivate.

Если вы работаете на операционной системе Windows, то вам необходимо использовать команду:

После выполнения этой команды виртуальное окружение будет деактивировано, и вы вернетесь в системное окружение Python.

Заключение

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

  1. Позволяет создавать отдельную изолированную среду для каждого проекта. Вы можете устанавливать и управлять зависимостями (библиотеки и пакеты) вашего проекта в изолированной среде, не влияя на другие проекты или систему в целом.
  2. С ее помощью создаются чистые и стабильные окружения для разработки и выполнения проектов. Начать работу можно с чистой виртуальной среды: установить только необходимые зависимости, избегая конфликтов между зависимостями других проектов. Это поможет снизить вероятность возникновения ошибок и облегчит управление зависимостями.
  3. Виртуальное окружение создает единообразную среду для вашего проекта, независимо от операционной системы или окружения разработки. Вы можете легко перенести ваш проект на другую машину или дать другим пользователям работать с вашим проектом.
  4. Управление версиями Python. Вы можете создавать и использовать разные виртуальные среды для различных версий Python, позволяя тестировать и разрабатывать проекты на разных версиях языка.

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

venv — Создание виртуальных сред¶

Модуль venv обеспечивает поддержку создания облегченных «виртуальных сред» с собственными каталогами сайтов, дополнительно изолированными от системных каталогов сайтов. Каждая виртуальная среда имеет собственный Python двоичный файл (который соответствует версии двоичного файла, используемый для создания этой среды) и может иметь собственный независимый набор установленных пакетов Python в каталогах сайта.

Дополнительные сведения о PEP 405 виртуальных средах см. в разделе Python.

Создание виртуальных сред¶

Создание виртуального окружения , выполнив команду venv :

python3 -m venv /path/to/new/virtual/environment 

При выполнении этой команды создается целевой каталог (создается любой родительский каталог, который ещё не существует) и в него помещается файл pyvenv.cfg с ключом home , указывающим на Python установку, из которой выполнялась команда (общее имя для целевого каталога — .venv ). Это также создает bin (или Scripts на Windows) подкаталог, содержащий copy/symlink набора из двух предметов/наборов из двух предметов Python (как подходящий для платформы или аргументов используемый во время создания окружающей среды). Он также создает (изначально пустой) подкаталоги lib/pythonX.Y/site-packages (в Windows, это Lib\site-packages ). Если указан существующий каталог, он будет переиспользуемый.

Не рекомендуется, начиная с версии 3.6: pyvenv был рекомендован инструмент для создания виртуальных сред для Python 3.3 и 3.4 и deprecated in Python 3.6.

Изменено в версии 3.5: Теперь рекомендуется использовать venv для создания виртуальных сред.

В Windows вызовите команду venv следующим образом:

c:\>c:\Python35\python -m venv c:\path\to\myenv

Также можно настроить переменные PATH и PATHEXT для установки Python :

c:\>python -m venv c:\path\to\myenv

Команда, если она выполняется с помощью команды -h , покажет доступные параметры:

usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR . ] Создаёт виртуальную среду Python в одном или нескольких целевых каталогах. позиционные аргументы: ENV_DIR Каталог в которм создаётся среда. опциональные аргументы: -h, --help показать это справочное сообщение и выйти --system-site-packages Предоставить виртуальной среде доступ к системному каталогу site-packages. --symlinks Пытаться использовать символические ссылки, а не копии, если они не являются стандартными для платформы. --copies Пытаться использовать копии, а не символические ссылки, даже если они используются по умолчанию для платформы. --clear Перед созданием среды удалить содержимое каталога среды, если оно уже существует. --upgrade Обновить каталог среды, чтобы использовать текущую версию Python, предполагая, что Python был обновлен на месте. --without-pip Пропускает установку или обновление pip в виртуальной среде (pip по умолчанию загружается автоматически) --prompt PROMPT Предоставляет альтернативное префикс приглашения для этой среды. После создания среды её можно активировать, например, создав сценарий активации в каталоге bin.

Изменено в версии 3.4: Устанавливает pip по умолчанию, добавил параметры —without-pip и —copies

Изменено в версии 3.4: В более ранних версиях, если целевой каталог уже существовал, возникала ошибка, если не был указан параметр —clear или —upgrade .

В то время как symlinks поддерживаются в Windows, они не рекомендуются. Особо значимый то, что двойной щелчок по python.exe in File Explorer решит symlink нетерпеливо и проигнорирует виртуальную среду.

В Microsoft Windows может потребоваться включить сценарий Activate.ps1 , задав политику выполнения для пользователя. Для этого введите следующую команду PowerShell:

PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

См. О политиках исполнения для получения большей информации.

Созданный файл pyvenv.cfg также включает ключ include-system-site-packages , набор к true , если venv управляют с опцией —system-site-packages , false иначе.

Если параметр —without-pip не задан, ensurepip будет вызываться для загрузки pip в виртуальную среду.

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

После создания виртуальной среды ее можно «активировать» с помощью сценария в двоичном каталоге виртуальной среды. Вызов сценария зависит от платформы ( должен быть заменен путем к каталогу, содержащему виртуальную среду):

Платформа Шелл Команда для активации виртуального окружения
POSIX bash/zsh $ source /bin/activate
fish $ . /bin/activate.fish
csh/tcsh $ source /bin/activate.csh
PowerShell Core $ /bin/Activate.ps1
Windows cmd.exe C:\> \Scripts\activate.bat
PowerShell PS C:\> \Scripts\Activate.ps1

Вы специально не обязаны активировать среду; активация просто добавляет двоичный каталог виртуальной среды к вашему пути, так что «python» вызывает Python интерпретатор виртуальной среды, и вы можете запускать установленные сценарии без необходимости использовать их полный путь. Однако все сценарии, установленные в виртуальной среде, должны работать без активации и запускаться с Python виртуальной среды автоматически.

Виртуальную среду можно деактивировать, введя в оболочку «деактивировать». Точный механизм зависит от платформы и является внутренней детализацией реализации (обычно используется скрипт или функция оболочки).

Добавлено в версии 3.4: Сценарии активации fish и csh .

Добавлено в версии 3.8: Сценарии активации PowerShell, установленные в POSIX для поддержки ядра PowerShell.

Виртуальная среда — окружающая среда Python, таким образом, что Python интерпретатор, библиотеки и сценарии, установленные в нее, изолированы от установленных в других виртуальных средах и (по умолчанию) любых библиотеках, установленных в «системе» Python, т.е. тот, который установлен как часть вашей операционной системы.

Виртуальная среда — это дерево каталогов, содержащее Python исполняемые файлы и другие файлы, указывающие, что это виртуальная среда.

Обычные средства установки, такие как setuptools и pip, работают, как и ожидалось, в виртуальных средах. Другими словами, когда виртуальная среда активна, они устанавливают Python пакеты в виртуальную среду без необходимости явного уведомления об этом.

Когда виртуальная среда активна (т.е. выполняется Python интерпретатор виртуальной среды), атрибуты sys.prefix и sys.exec_prefix указывают на базовый каталог виртуальной среды, тогда как sys.base_prefix и sys.base_exec_prefix указывают на невиртуальную среду Python инсталляцию, которая была используемый для создания виртуальной среды. Если виртуальная среда не активна, то sys.prefix совпадает с sys.base_prefix и sys.exec_prefix совпадает с sys.base_exec_prefix (все они указывают на невиртуальную среду Python установки).

Если виртуальная среда активна, все параметры, изменяющие путь установки, будут игнорироваться из всех файлов конфигурации distutils , чтобы предотвратить непреднамеренную установку проектов вне виртуальной среды.

При работе в командной оболочке пользователи могут сделать виртуальную среду активной, запустив сценарий activate в каталоге исполняемых файлов виртуальной среды (точное имя файла и команда для использования файла зависят от оболочки), который добавляет каталог виртуальной среды для исполняемых файлов в PATH переменную среды для выполняющейся оболочки. Не должно быть необходимости в других обстоятельствах активировать виртуальную среду; скрипты, установленные в виртуальных средах, имеют строку «shebang», которая указывает на Python интерпретатор виртуальной среды. Это означает, что сценарий будет выполняться с этим интерпретатор независимо от значение PATH . В Windows обработка строк «shebang» поддерживается, если установлена Python Launcher для Windows (это было добавлено в Python в 3.3 — подробнее см. PEP 397). Таким образом, двойной щелчок по установленному сценарию в окне проводника Windows должен выполнять сценарий с правильной интерпретатором без необходимости ссылки на его виртуальную среду в PATH .

API¶

Метод высокого уровня, описанный выше, использует простой API, который обеспечивает механизмы для создателей виртуальной среды сторонних производителей для настройки создания среды в соответствии с их потребностями, классом EnvBuilder .

class venv. EnvBuilder ( system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None ) ¶

Класс EnvBuilder принимает следующие аргументы ключевой при создании экземпляра:

  • system_site_packages — логическое значение, указывающее, что система Python пакеты сайта должны быть доступны среде (по умолчанию — False ).
  • clear — логическое значение, которое, если имеет значение true, перед созданием среды удалит содержимое любого существующего целевого каталога.
  • symlinks — логическое значение, указывающее, следует ли пытаться симулировать двоичный файл Python, а не копировать.
  • upgrade — логический значение, который, если имеет значение true, обновит существующую среду с запущенным Python — для использования при обновлении Python на месте (по умолчанию — False ).
  • with_pip — логический значение, который, если имеет значение true, обеспечивает установку pip в виртуальной среде. Используется ensurepip с опцией —default-pip .
  • prompt — строка, которая будет используемый после активации виртуальной среды (по умолчанию None означает, что именем каталога среды будет используемый).

Изменено в версии 3.4: Добавлен параметр with_pip

Добавлено в версии 3.6: Добавлен параметр prompt

Создатели сторонних средств виртуальной среды смогут свободно использовать предоставленный класс EnvBuilder в качестве базового класса.

Возвращенный env-builder — это объект, имеющий метод create :

Создать виртуальную среду, указав целевой каталог (абсолютный или относительный к текущему каталогу), который должен содержать виртуальную среду. Метод create создаст среду в указанном каталоге или создаст соответствующее исключение.

Метод create класса EnvBuilder иллюстрирует хуки, доступные для настройки подкласс:

def create(self, env_dir): """ Создать виртуализированную среду Python в каталоге. env_dir - целевой каталог для создания среды. """ env_dir = os.path.abspath(env_dir) context = self.ensure_directories(env_dir) self.create_configuration(context) self.setup_python(context) self.setup_scripts(context) self.post_setup(context) 

Создает каталог среды и все необходимые каталоги и возвращает объект контекст. Это просто держатель для атрибуты (например, пути), для использования другими способами. Каталоги уже могут существовать, если указаны clear или upgrade , позволяющие работать с существующим каталогом среды.

Создает файл конфигурации pyvenv.cfg в среде.

Создает копию или символьную ссылку на исполняемый файл Python в среде. В системах POSIX, если был используемый определенный исполняемый python3.x , будут созданы символьные ссылки на python и python3 , указывающие на этот исполняемый файл, если только файлы с такими именами не существуют.

Устанавливает сценарии активации, соответствующие платформе, в виртуальную среду.

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

Изменено в версии 3.7.2: Windows теперь использует сценарии перенаправителя для python[w].exe вместо копирования фактических двоичных файлов. В 3.7.2 только setup_python() ничего не делает, если не выполняется из построения в исходном дереве.

Изменено в версии 3.7.3: Windows копирует сценарии перенаправителя как часть setup_python() вместо setup_scripts() . В 3.7.2 этого не произошло. При использовании symlinks будут связаны исходные исполняемые файлы.

Кроме того, EnvBuilder предоставляет этот сервисный метод, который можно назвать от setup_scripts() или post_setup() в подклассы, чтобы помочь в установке пользовательских сценариев в виртуальную среду.

install_scripts ( context, path ) ¶

path — это путь к каталогу, который должен содержать подкаталоги «common», «posix», «nt», каждый из которых содержит скрипты, предназначенные для каталога bin в среде. Содержимое «common» и каталог, соответствующий os.name , копируются после некоторой замены текста местозаполнителями:

  • __VENV_DIR__ заменяется абсолютным путем к каталогу среды.
  • __VENV_NAME__ заменяется именем среды (конечный сегмент пути каталога среды).
  • __VENV_PROMPT__ заменяется подсказкой (имя среды, заключенное в круглые скобки и содержащее следующий пробел)
  • __VENV_BIN_NAME__ заменяется именем каталога bin ( bin или Scripts ).
  • __VENV_PYTHON__ заменяется абсолютным путем исполняемого файла среды.

Каталоги могут существовать (при обновлении существующей среды).

Существует также функция удобства на уровне модуля:

venv. create ( env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None ) ¶

Создать EnvBuilder с заданными аргументами ключевой и вызовите его метод create() с аргументом env_dir.

Добавлено в версии 3.3.

Изменено в версии 3.4: Добавлен параметр with_pip

Изменено в версии 3.6: Добавлен параметр prompt

Пример расширения EnvBuilder ¶

В следующем сценарии показано, как расширить EnvBuilder путем реализации подкласса, который устанавливает setuptools и pip в созданную виртуальную среду:

import os import os.path from subprocess import Popen, PIPE import sys from threading import Thread from urllib.parse import urlparse from urllib.request import urlretrieve import venv class ExtendedEnvBuilder(venv.EnvBuilder): """ Билдер устанавливает setuptools и pip, чтобы можно было использовать pip или easy_install другие пакеты в созданной виртуальной среде. :param nodist: Если true, в созданную виртуальную среду не устанавливаются setuptools и pip. :param nopip: Если true, pip не устанавливается в созданную виртуальную среду. :param progress: Если установлены setuptools или pip, ход установки можно контролировать, передавая вызываемый процесс. Если он указан, он вызывается с двумя аргументами: строка, указывающим на некоторый прогресс, и контекст, указывающим, откуда идет строка. Аргумент контекст может иметь один из трёх значений: 'main', указывающий, что он вызывается из самого virtualize(), и 'stdout' и 'stderr', которые получаются путём считывания строк из выходных потоков подпроцессы, используемый для установки приложения. Если вызываемый объект не указан, в sys.stderr выводится информация о ходе выполнения по умолчанию. """ def __init__(self, *args, **kwargs): self.nodist = kwargs.pop('nodist', False) self.nopip = kwargs.pop('nopip', False) self.progress = kwargs.pop('progress', None) self.verbose = kwargs.pop('verbose', False) super().__init__(*args, **kwargs) def post_setup(self, context): """ Настромит пакеты, которые необходимо предварительно установить в создаваемую виртуальную среду. :param context: Сведения для обрабатываемого запроса на создание виртуальной среды. """ os.environ['VIRTUAL_ENV'] = context.env_dir if not self.nodist: self.install_setuptools(context) # Can't install pip without setuptools if not self.nopip and not self.nodist: self.install_pip(context) def reader(self, stream, context): """ Чтение строк из выходного потока подпроцессов и передача в вызываемый процесс (если указан) или запись информации о ходе в sys.stderr. """ progress = self.progress while True: s = stream.readline() if not s: break if progress is not None: progress(s, context) else: if not self.verbose: sys.stderr.write('.') else: sys.stderr.write(s.decode('utf-8')) sys.stderr.flush() stream.close() def install_script(self, context, name, url): _, _, path, _, _, _ = urlparse(url) fn = os.path.split(path)[-1] binpath = context.bin_path distpath = os.path.join(binpath, fn) # Загрузить сценарий в папку двоичных файлов виртуальной среды urlretrieve(url, distpath) progress = self.progress if self.verbose: term = '\n' else: term = '' if progress is not None: progress('Installing %s . %s' % (name, term), 'main') else: sys.stderr.write('Installing %s . %s' % (name, term)) sys.stderr.flush() # Установка в виртуальную среду args = [context.env_exe, fn] p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath) t1 = Thread(target=self.reader, args=(p.stdout, 'stdout')) t1.start() t2 = Thread(target=self.reader, args=(p.stderr, 'stderr')) t2.start() p.wait() t1.join() t2.join() if progress is not None: progress('done.', 'main') else: sys.stderr.write('done.\n') # Очистить - больше не нужно os.unlink(distpath) def install_setuptools(self, context): """ Установить setuptools в виртуальную среду. :param context: Сведения для обрабатываемого запроса на создание виртуальной среды. """ url = 'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py' self.install_script(context, 'setuptools', url) # clear up the setuptools archive which gets downloaded pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz') files = filter(pred, os.listdir(context.bin_path)) for f in files: f = os.path.join(context.bin_path, f) os.unlink(f) def install_pip(self, context): """ Установить pip в виртуальную среду. :param context: Сведения для обрабатываемого запроса на создание виртуальной среды. """ url = 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py' self.install_script(context, 'pip', url) def main(args=None): compatible = True if sys.version_info  (3, 3): compatible = False elif not hasattr(sys, 'base_prefix'): compatible = False if not compatible: raise ValueError('This script is only for use with ' 'Python 3.3 or later') else: import argparse parser = argparse.ArgumentParser(prog=__name__, description='Creates virtual Python ' 'environments in one or ' 'more target ' 'directories.') parser.add_argument('dirs', metavar='ENV_DIR', nargs='+', help='A directory in which to create the 'virtual environment.') parser.add_argument('--no-setuptools', default=False, action='store_true', dest='nodist', help="Don't install setuptools or pip in the " "virtual environment.") parser.add_argument('--no-pip', default=False, action='store_true', dest='nopip', help="Don't install pip in the virtual " "environment.") parser.add_argument('--system-site-packages', default=False, action='store_true', dest='system_site', help='Give the virtual environment access to the ' 'system site-packages dir.') if os.name == 'nt': use_symlinks = False else: use_symlinks = True parser.add_argument('--symlinks', default=use_symlinks, action='store_true', dest='symlinks', help='Try to use symlinks rather than copies, ' 'when symlinks are not the default for ' 'the platform.') parser.add_argument('--clear', default=False, action='store_true', dest='clear', help='Delete the contents of the ' 'virtual environment ' 'directory if it already ' 'exists, before virtual ' 'environment creation.') parser.add_argument('--upgrade', default=False, action='store_true', dest='upgrade', help='Upgrade the virtual ' 'environment directory to ' 'use this version of ' 'Python, assuming Python ' 'has been upgraded ' 'in-place.') parser.add_argument('--verbose', default=False, action='store_true', dest='verbose', help='Display the output ' 'from the scripts which ' 'install setuptools and pip.') options = parser.parse_args(args) if options.upgrade and options.clear: raise ValueError('you cannot supply --upgrade and --clear together.') builder = ExtendedEnvBuilder(system_site_packages=options.system_site, clear=options.clear, symlinks=options.symlinks, upgrade=options.upgrade, nodist=options.nodist, nopip=options.nopip, verbose=options.verbose) for d in options.dirs: builder.create(d) if __name__ == '__main__': rc = 1 try: main() rc = 0 except Exception as e: print('Error: %s' % e, file=sys.stderr) sys.exit(rc) 

Этот сценарий также доступен для онлайн загрузки.

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

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