Документация Python неофициальный перевод

venv.md

497 строк · 42.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.11/library/venv.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`venv`](https://python-all.ru/3.11/library/venv.html#module-venv) – Создание виртуальных окружений89Новое в версии 3.3.1011**Исходный код:** [Lib/venv/](https://python-all.ru/src/3.11/Lib/venv)1213---1415Модуль `venv` поддерживает создание легковесных «виртуальных окружений», каждое со своим независимым набором пакетов Python, установленных в собственные каталоги [`site`](https://python-all.ru/3.11/library/site.html#module-site). Виртуальное окружение создаётся поверх существующей установки Python (она называется «базовым» Python виртуального окружения) и может быть изолировано от пакетов базового окружения – тогда будут доступны только те пакеты, которые явно установлены в виртуальное окружение.1617При использовании внутри виртуального окружения стандартные инструменты установки, такие как [pip](https://python-all.ru/3.11/library/venv.html), устанавливают пакеты Python в это виртуальное окружение без необходимости явного указания.1819Виртуальное окружение (в числе прочего):2021- Содержит в себе конкретный интерпретатор Python, программные библиотеки и исполняемые файлы, необходимые для поддержки проекта (библиотеки или приложения). По умолчанию они изолированы от программ в других виртуальных окружениях и от интерпретаторов Python и библиотек, установленных в операционной системе.22- Содержится в каталоге, который обычно называется `venv` или `.venv` в каталоге проекта, или в каталоге-контейнере для множества виртуальных окружений, например `~/.virtualenvs`.23- Не помещается в системы управления версиями, такие как Git.24- Считается одноразовым – его должно быть легко удалить и воссоздать с нуля. В окружение не помещается никакой код проекта.25- Не считается переносимым или копируемым – достаточно воссоздать такое же окружение в нужном месте.2627Для получения дополнительной информации о виртуальных окружениях Python см. [**PEP 405**](https://python-all.ru/3.11/library/venv.html).2829> **См. также**30>31> [Руководство пользователя по упаковке Python: создание и использование виртуальных окружений](https://python-all.ru/3.11/library/venv.html)3233[Доступность](https://python-all.ru/3.11/library/intro.html#availability): not Emscripten, not WASI.3435Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.11/library/intro.html#wasm-availability) для получения дополнительной информации.3637## Создание виртуальных окружений3839Создание [виртуальных окружений](https://python-all.ru/3.11/library/venv.html#venv-def) выполняется с помощью команды `venv`:4041```python42python -m venv /path/to/new/virtual/environment43```4445Выполнение этой команды создает целевой каталог (создавая все родительские каталоги, которые еще не существуют) и помещает в него файл `pyvenv.cfg` с ключом `home`, указывающим на установку Python, из которой была запущена команда (обычное имя для целевого каталога – `.venv`). Она также создает подкаталог `bin` (или `Scripts` в Windows), содержащий копию или символическую ссылку на бинарные файлы Python (в зависимости от платформы или аргументов, использованных при создании окружения). Также создается (изначально пустой) подкаталог `lib/pythonX.Y/site-packages` (в Windows это `Lib\site-packages`). Если указан существующий каталог, он будет повторно использован.4647Изменено в версии 3.5: Теперь для создания виртуальных окружений рекомендуется использовать `venv`.4849Устарело с версии 3.6: `pyvenv` был рекомендуемым инструментом для создания виртуальных окружений для Python 3.3 и 3.4 и является [устаревшим в Python 3.6](https://python-all.ru/3.11/whatsnew/3.6.html#whatsnew36-venv).5051В Windows команда `venv` выполняется следующим образом:5253```text54c:\>c:\Python35\python -m venv c:\path\to\myenv55```5657Альтернативно, если вы настроили переменные `PATH` и `PATHEXT` для вашей [установки Python](https://python-all.ru/3.11/using/windows.html#using-on-windows):5859```text60c:\>python -m venv c:\path\to\myenv61```6263При запуске с флагом `-h` команда отображает доступные параметры:6465```text66usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]67            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]68            ENV_DIR [ENV_DIR ...]6970Creates virtual Python environments in one or more target directories.7172positional arguments:73  ENV_DIR               A directory to create the environment in.7475optional arguments:76  -h, --help            show this help message and exit77  --system-site-packages78                        Give the virtual environment access to the system79                        site-packages dir.80  --symlinks            Try to use symlinks rather than copies, when symlinks81                        are not the default for the platform.82  --copies              Try to use copies rather than symlinks, even when83                        symlinks are the default for the platform.84  --clear               Delete the contents of the environment directory if it85                        already exists, before environment creation.86  --upgrade             Upgrade the environment directory to use this version87                        of Python, assuming Python has been upgraded in-place.88  --without-pip         Skips installing or upgrading pip in the virtual89                        environment (pip is bootstrapped by default)90  --prompt PROMPT       Provides an alternative prompt prefix for this91                        environment.92  --upgrade-deps        Upgrade core dependencies: pip setuptools to the93                        latest version in PyPI9495Once an environment has been created, you may wish to activate it, e.g. by96sourcing an activate script in its bin directory.97```9899Изменено в версии 3.9: Добавлена опция `--upgrade-deps` для обновления pip и setuptools до последних версий на PyPI100101Изменено в версии 3.4: По умолчанию устанавливается pip, добавлены опции `--without-pip` и `--copies`102103Изменено в версии 3.4: В более ранних версиях, если целевой каталог уже существовал, возникала ошибка, если не была предоставлена опция `--clear` или `--upgrade`.104105> **Примечание**106>107> Хотя символические ссылки поддерживаются в Windows, они не рекомендуются. Особенно важно отметить, что двойной щелчок по `python.exe` в Проводнике разрешит символьную ссылку немедленно и проигнорирует виртуальное окружение.108109> **Примечание**110>111> В Microsoft Windows может потребоваться включить сценарий `Activate.ps1`, установив политику выполнения для пользователя. Это можно сделать, выполнив следующую команду PowerShell:112>113> PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser114>115> См. [О политиках выполнения](https://python-all.ru/3.11/library/venv.html) для получения дополнительной информации.116117Созданный файл `pyvenv.cfg` также включает ключ `include-system-site-packages`, установленный в `true`, если `venv` запущен с опцией `--system-site-packages`, и в `false` в противном случае.118119Если не указана опция `--without-pip`, будет вызван [`ensurepip`](https://python-all.ru/3.11/library/ensurepip.html#module-ensurepip) для начальной установки `pip` в виртуальное окружение.120121Можно указать несколько путей для `venv`, в этом случае будет создано идентичное виртуальное окружение с заданными опциями для каждого указанного пути.122123## Как работают виртуальные окружения124125Когда интерпретатор Python выполняется из виртуального окружения, [`sys.prefix`](https://python-all.ru/3.11/library/sys.html#sys.prefix) и [`sys.exec_prefix`](https://python-all.ru/3.11/library/sys.html#sys.exec_prefix) указывают на каталоги виртуального окружения, тогда как [`sys.base_prefix`](https://python-all.ru/3.11/library/sys.html#sys.base_prefix) и [`sys.base_exec_prefix`](https://python-all.ru/3.11/library/sys.html#sys.base_exec_prefix) указывают на каталоги базового Python, использованного для создания окружения. Достаточно проверить `sys.prefix != sys.base_prefix`, чтобы определить, выполняется ли текущий интерпретатор из виртуального окружения.126127Виртуальное окружение может быть «активировано» с помощью сценария в его бинарном каталоге (`bin` в POSIX; `Scripts` в Windows). Это добавит этот каталог в начало вашей `PATH`, так что запуск **python** вызовет интерпретатор Python окружения, и вы сможете запускать установленные скрипты без указания полного пути. Вызов сценария активации зависит от платформы (`<venv>` должен быть заменён на путь к каталогу, содержащему виртуальное окружение):128129| Платформа | Оболочка | Команда активации виртуального окружения |130| --- | --- | --- |131| POSIX | bash/zsh | `$ source <venv>/bin/activate` |132| fish | `$ source <venv>/bin/activate.fish` |  |133| csh/tcsh | `$ source <venv>/bin/activate.csh` |  |134| PowerShell | `$ <venv>/bin/Activate.ps1` |  |135| Windows | cmd.exe | `C:\> <venv>\Scripts\activate.bat` |136| PowerShell | `PS C:\> <venv>\Scripts\Activate.ps1` |  |137138Новое в версии 3.4: Скрипты активации для **fish** и **csh**.139140Новое в версии 3.8: Скрипты активации PowerShell устанавливаются в POSIX для поддержки PowerShell Core.141142Нет особой *необходимости* активировать виртуальное окружение, так как можно просто указать полный путь к его интерпретатору Python при вызове Python. Кроме того, все скрипты, установленные в окружении, должны быть запускаемы без его активации.143144Чтобы добиться этого, скрипты, установленные в виртуальные окружения, имеют строку «shebang», которая указывает на интерпретатор Python окружения, т.е. `#!/<path-to-venv>/bin/python`. Это означает, что скрипт будет запускаться с этим интерпретатором независимо от значения `PATH`. В Windows обработка строки «shebang» поддерживается, если установлен [Python Launcher for Windows](https://python-all.ru/3.11/using/windows.html#launcher). Таким образом, двойной щелчок по установленному скрипту в окне проводника Windows должен запустить его с правильным интерпретатором без необходимости активации окружения или нахождения в `PATH`.145146Когда виртуальное окружение активировано, переменная окружения `VIRTUAL_ENV` устанавливается в путь к окружению. Поскольку явная активация виртуального окружения не требуется для его использования, `VIRTUAL_ENV` нельзя использовать для определения того, используется ли виртуальное окружение.147148> **Предупреждение**149>150> Поскольку скрипты, установленные в окружениях, не должны рассчитывать на активацию окружения, их shebang-строки содержат абсолютные пути к интерпретаторам своих окружений. Из-за этого окружения в общем случае непереносимы. Всегда должен быть простой способ воссоздать окружение (например, если есть файл требований `requirements.txt`, можно вызвать `pip install -r requirements.txt`, используя `pip` окружения, чтобы установить все необходимые пакеты). Если по какой-либо причине нужно переместить окружение в новое место, следует воссоздать его в нужном месте и удалить старое. Если окружение перемещается из-за перемещения родительского каталога, воссоздайте его в новом месте. В противном случае установленное в окружении ПО может работать некорректно.151152Деактивировать виртуальное окружение можно, введя в оболочке `deactivate`. Точный механизм зависит от платформы и является деталью внутренней реализации (обычно используется скрипт или функция оболочки).153154## API155156Описанный выше высокоуровневый метод использует простой API, предоставляющий механизмы для создателей сторонних виртуальных окружений, чтобы настраивать создание окружения по своему усмотрению – класс [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder).157158#### `class venv.EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, upgrade_deps=False)`159160Класс [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder) принимает следующие именованные аргументы при создании экземпляра:161162- `system_site_packages` – логическое значение, указывающее, что системные site-packages Python должны быть доступны окружению (по умолчанию `False`).163- `clear` – логическое значение: если истинно, удаляет содержимое любого существующего целевого каталога перед созданием окружения.164- `symlinks` – логическое значение, указывающее, следует ли пытаться создать символическую ссылку на бинарный файл Python вместо копирования.165- `upgrade` – логическое значение: если истинно, обновляет существующее окружение с текущим Python – для использования, когда этот Python был обновлен на месте (по умолчанию `False`).166- `with_pip` – логическое значение: если истинно, гарантирует установку pip в виртуальное окружение. Для этого используется [`ensurepip`](https://python-all.ru/3.11/library/ensurepip.html#module-ensurepip) с опцией `--default-pip`.167- `prompt` – строка, используемая после активации виртуального окружения (по умолчанию `None`, что означает, что будет использовано имя каталога окружения). Если указана специальная строка `"."`, в качестве приглашения используется имя текущего каталога.168- `upgrade_deps` – Обновляет базовые модули venv до последних на PyPI169170Изменено в версии 3.4: Добавлен параметр `with_pip`171172Изменено в версии 3.6: Добавлен параметр `prompt`173174Изменено в версии 3.9: Добавлен параметр `upgrade_deps`175176Создатели сторонних инструментов для виртуальных окружений могут свободно использовать предоставленный класс [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder) в качестве базового класса.177178Возвращаемый env-builder – это объект, у которого есть метод `create`:179180#### `create(env_dir)`181182Создаёт виртуальное окружение путём указания целевого каталога (абсолютного или относительного по отношению к текущему каталогу), который будет содержать виртуальное окружение. Метод `create` либо создаст окружение в указанном каталоге, либо вызовет соответствующее исключение.183184Метод `create` класса [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder) иллюстрирует точки расширения, доступные для настройки в подклассах:185186```python187def create(self, env_dir):188    """189    Создаёт виртуализированное окружение Python в указанном каталоге.190    Параметр env_dir – это целевой каталог, в котором создаётся окружение.191    """192    env_dir = os.path.abspath(env_dir)193    context = self.ensure_directories(env_dir)194    self.create_configuration(context)195    self.setup_python(context)196    self.setup_scripts(context)197    self.post_setup(context)198```199200Каждый из методов [`ensure_directories()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.ensure_directories), [`create_configuration()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.create_configuration), [`setup_python()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.setup_python), [`setup_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.setup_scripts) и [`post_setup()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.post_setup) может быть переопределён.201202#### `ensure_directories(env_dir)`203204Создаёт каталог окружения и все необходимые подкаталоги, которых ещё нет, и возвращает объект контекста. Этот объект контекста – просто контейнер для атрибутов (например, путей), используемых другими методами. Если [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder) создаётся с аргументом `clear=True`, содержимое каталога окружения будет очищено, а затем все необходимые подкаталоги будут созданы заново.205206Возвращаемый объект контекста – это [`types.SimpleNamespace`](https://python-all.ru/3.11/library/types.html#types.SimpleNamespace) со следующими атрибутами:207208- `env_dir` – расположение виртуального окружения. Используется для `__VENV_DIR__` в скриптах активации (см. [`install_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.install_scripts)).209- `env_name` – имя виртуального окружения. Используется для `__VENV_NAME__` в скриптах активации (см. [`install_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.install_scripts)).210- `prompt` – приглашение, используемое скриптами активации. Используется для `__VENV_PROMPT__` в скриптах активации (см. [`install_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.install_scripts)).211- `executable` – используемый исполняемый файл Python для виртуального окружения. Учитывает случай, когда виртуальное окружение создаётся из другого виртуального окружения.212- `inc_path` – путь include для виртуального окружения.213- `lib_path` – путь purelib для виртуального окружения.214- `bin_path` – путь скриптов для виртуального окружения.215- `bin_name` – имя пути скриптов относительно расположения виртуального окружения. Используется для `__VENV_BIN_NAME__` в скриптах активации (см. [`install_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.install_scripts)).216- `env_exe` – имя интерпретатора Python в виртуальном окружении. Используется для `__VENV_PYTHON__` в скриптах активации (см. [`install_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.install_scripts)).217- `env_exec_cmd` – имя интерпретатора Python с учётом перенаправлений файловой системы. Может использоваться для запуска Python в виртуальном окружении.218219Изменено в версии 3.11: *venv* [схема установки sysconfig](https://python-all.ru/3.11/library/sysconfig.html#installation-paths) используется для построения путей создаваемых каталогов.220221#### `create_configuration(context)`222223Создаёт файл конфигурации `pyvenv.cfg` в окружении.224225#### `setup_python(context)`226227Создаёт копию или символическую ссылку на исполняемый файл Python в окружении. В системах POSIX, если был указан конкретный исполняемый файл `python3.x`, будут созданы символические ссылки на `python` и `python3`, указывающие на этот исполняемый файл, если файлы с такими именами уже не существуют.228229#### `setup_scripts(context)`230231Устанавливает скрипты активации, соответствующие платформе, в виртуальное окружение.232233#### `upgrade_dependencies(context)`234235Обновляет основные пакеты зависимостей venv (в настоящее время `pip` и `setuptools`) в окружении. Для этого вызывается исполняемый файл `pip` внутри окружения.236237Новое в версии 3.9.238239#### `post_setup(context)`240241Метод-заглушка, который может быть переопределён в сторонних реализациях для предварительной установки пакетов в виртуальное окружение или выполнения других действий после создания.242243Изменено в версии 3.7.2: В Windows теперь используются скрипты-перенаправители для `python[w].exe` вместо копирования самих исполняемых файлов. В версии 3.7.2 только [`setup_python()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.setup_python) ничего не делает, если не запущен из сборки в исходном дереве.244245Изменено в версии 3.7.3: В Windows скрипты-перенаправители копируются как часть [`setup_python()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.setup_python) вместо [`setup_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.setup_scripts). В версии 3.7.2 это было не так. При использовании символьных ссылок будут связаны исходные исполняемые файлы.246247Кроме того, [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder) предоставляет этот вспомогательный метод, который можно вызвать из [`setup_scripts()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.setup_scripts) или [`post_setup()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.post_setup) в подклассах для установки пользовательских скриптов в виртуальное окружение.248249#### `install_scripts(context, path)`250251*path* – это путь к каталогу, который должен содержать подкаталоги «common», «posix», «nt», каждый из которых содержит скрипты, предназначенные для каталога bin в окружении. Содержимое «common» и каталога, соответствующего [`os.name`](https://python-all.ru/3.11/library/os.html#os.name), копируется после замены некоторых текстовых плейсхолдеров:252253- `__VENV_DIR__` заменяется на абсолютный путь к каталогу окружения.254- `__VENV_NAME__` заменяется на имя окружения (последний сегмент пути к каталогу окружения).255- `__VENV_PROMPT__` заменяется на приглашение (имя окружения в скобках и с последующим пробелом)256- `__VENV_BIN_NAME__` заменяется на имя каталога bin ( `bin` или `Scripts`).257- `__VENV_PYTHON__` заменяется на абсолютный путь к исполняемому файлу окружения.258259Каталоги могут существовать (на случай, когда обновляется существующее окружение).260261Также существует удобная функция уровня модуля:262263#### `venv.create(env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None, upgrade_deps=False)`264265Создаёт экземпляр [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder) с заданными именованными аргументами и вызывает его метод [`create()`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder.create) с аргументом *env\_dir*.266267Новое в версии 3.3.268269Изменено в версии 3.4: Добавлен параметр `with_pip`270271Изменено в версии 3.6: Добавлен параметр `prompt`272273Изменено в версии 3.9: Добавлен параметр `upgrade_deps`274275## Пример расширения `EnvBuilder`276277Следующий скрипт показывает, как расширить [`EnvBuilder`](https://python-all.ru/3.11/library/venv.html#venv.EnvBuilder), реализовав подкласс, который устанавливает setuptools и pip в созданное виртуальное окружение:278279```python280import os281import os.path282from subprocess import Popen, PIPE283import sys284from threading import Thread285from urllib.parse import urlparse286from urllib.request import urlretrieve287import venv288289class ExtendedEnvBuilder(venv.EnvBuilder):290    """291    Данный построитель устанавливает setuptools и pip, чтобы с их помощью можно было292    устанавливать другие пакеты в созданное виртуальное окружение командой pip или easy_install.293294    :param nodist: Если истина, setuptools и pip не устанавливаются в295                   созданное виртуальное окружение.296    :param nopip: Если истина, pip не устанавливается в созданное297                  виртуальное окружение.298    :param progress: Если setuptools или pip устанавливаются, за ходом установки299                     можно следить, передав вызываемый объект для отслеживания прогресса.300                     Если он указан, то вызывается с двумя301                     аргументами: строкой, описывающей текущий этап, и302                     контекстом, указывающим, откуда пришла эта строка.303                     Аргумент context может принимать одно из трёх значений:304                     'main' – вызов происходит из самой virtualize(),305                     а также 'stdout' и 'stderr' – строки берутся306                     из потоков вывода подпроцесса, который307                     используется для установки приложения.308309                     Если вызываемый объект не указан, по умолчанию сведения о ходе выполнения310                     выводятся в sys.stderr.311    """312313    def __init__(self, *args, **kwargs):314        self.nodist = kwargs.pop('nodist', False)315        self.nopip = kwargs.pop('nopip', False)316        self.progress = kwargs.pop('progress', None)317        self.verbose = kwargs.pop('verbose', False)318        super().__init__(*args, **kwargs)319320    def post_setup(self, context):321        """322        Устанавливает пакеты, которые необходимо предварительно установить в создаваемое виртуальное окружение.323        создаваемое виртуальное окружение324325        обрабатываемого запроса на создание виртуального окружения326                        запрос на создание обрабатывается327        """328        os.environ['VIRTUAL_ENV'] = context.env_dir329        if not self.nodist:330            self.install_setuptools(context)331        # Читает строки из потока вывода подпроцесса и либо передаёт их вызываемому объекту для отслеживания хода выполнения332        if not self.nopip and not self.nodist:333            self.install_pip(context)334335    def reader(self, stream, context):336        """337        Читает строки из потока вывода подпроцесса и передаёт их в индикатор прогресса338        Загружает скрипт в папку с бинарными файлами виртуального окружения339        """340        progress = self.progress341        while True:342            s = stream.readline()343            if not s:344                break345            if progress is not None:346                progress(s, context)347            else:348                if not self.verbose:349                    sys.stderr.write('.')350                else:351                    sys.stderr.write(s.decode('utf-8'))352                sys.stderr.flush()353        stream.close()354355    def install_script(self, context, name, url):356        _, _, path, _, _, _ = urlparse(url)357        fn = os.path.split(path)[-1]358        binpath = context.bin_path359        distpath = os.path.join(binpath, fn)360        # Устанавливает в виртуальное окружение361        urlretrieve(url, distpath)362        progress = self.progress363        if self.verbose:364            term = '\n'365        else:366            term = ''367        if progress is not None:368            progress('Installing %s ...%s' % (name, term), 'main')369        else:370            sys.stderr.write('Installing %s ...%s' % (name, term))371            sys.stderr.flush()372        # Очистка – больше не требуется373        args = [context.env_exe, fn]374        p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)375        t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))376        t1.start()377        t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))378        t2.start()379        p.wait()380        t1.join()381        t2.join()382        if progress is not None:383            progress('done.', 'main')384        else:385            sys.stderr.write('done.\n')386        # Очищает – больше не требуется387        os.unlink(distpath)388389    def install_setuptools(self, context):390        """391        Устанавливает setuptools в виртуальное окружение392393        обрабатываемого запроса на создание виртуального окружения394                        запрос на создание обрабатывается395        """396        url = 'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py'397        self.install_script(context, 'setuptools', url)398        # Устанавливает pip в виртуальное окружение.399        pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')400        files = filter(pred, os.listdir(context.bin_path))401        for f in files:402            f = os.path.join(context.bin_path, f)403            os.unlink(f)404405    def install_pip(self, context):406        """407        Устанавливает pip в виртуальное окружение408409        обрабатываемого запроса на создание виртуального окружения410                        запрос на создание обрабатывается411        """412        url = 'https://bootstrap.pypa.io/get-pip.py'413        self.install_script(context, 'pip', url)414415def main(args=None):416    compatible = True417    if sys.version_info < (3, 3):418        compatible = False419    elif not hasattr(sys, 'base_prefix'):420        compatible = False421    if not compatible:422        raise ValueError('This script is only for use with '423                         'Python 3.3 or later')424    else:425        import argparse426427        parser = argparse.ArgumentParser(prog=__name__,428                                         description='Creates virtual Python '429                                                     'environments in one or '430                                                     'more target '431                                                     'directories.')432        parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',433                            help='A directory in which to create the '434                                 'virtual environment.')435        parser.add_argument('--no-setuptools', default=False,436                            action='store_true', dest='nodist',437                            help="Don't install setuptools or pip in the "438                                 "virtual environment.")439        parser.add_argument('--no-pip', default=False,440                            action='store_true', dest='nopip',441                            help="Don't install pip in the virtual "442                                 "environment.")443        parser.add_argument('--system-site-packages', default=False,444                            action='store_true', dest='system_site',445                            help='Give the virtual environment access to the '446                                 'system site-packages dir.')447        if os.name == 'nt':448            use_symlinks = False449        else:450            use_symlinks = True451        parser.add_argument('--symlinks', default=use_symlinks,452                            action='store_true', dest='symlinks',453                            help='Try to use symlinks rather than copies, '454                                 'when symlinks are not the default for '455                                 'the platform.')456        parser.add_argument('--clear', default=False, action='store_true',457                            dest='clear', help='Delete the contents of the '458                                               'virtual environment '459                                               'directory if it already '460                                               'exists, before virtual '461                                               'environment creation.')462        parser.add_argument('--upgrade', default=False, action='store_true',463                            dest='upgrade', help='Upgrade the virtual '464                                                 'environment directory to '465                                                 'use this version of '466                                                 'Python, assuming Python '467                                                 'has been upgraded '468                                                 'in-place.')469        parser.add_argument('--verbose', default=False, action='store_true',470                            dest='verbose', help='Display the output '471                                               'from the scripts which '472                                               'install setuptools and pip.')473        options = parser.parse_args(args)474        if options.upgrade and options.clear:475            raise ValueError('you cannot supply --upgrade and --clear together.')476        builder = ExtendedEnvBuilder(system_site_packages=options.system_site,477                                       clear=options.clear,478                                       symlinks=options.symlinks,479                                       upgrade=options.upgrade,480                                       nodist=options.nodist,481                                       nopip=options.nopip,482                                       verbose=options.verbose)483        for d in options.dirs:484            builder.create(d)485486if __name__ == '__main__':487    rc = 1488    try:489        main()490        rc = 0491    except Exception as e:492        print('Error: %s' % e, file=sys.stderr)493    sys.exit(rc)494```495496Этот скрипт также доступен для загрузки [онлайн](https://python-all.ru/3.11/library/venv.html).497