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

venv.md

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

1> **Источник:** https://python-all.ru/3.9/library/venv.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`venv`](https://python-all.ru/3.9/library/venv.html#module-venv) – Создание виртуальных окружений89Новое в версии 3.3.1011**Исходный код:** [Lib/venv/](https://python-all.ru/src/3.9/Lib/venv)1213---1415Модуль [`venv`](https://python-all.ru/3.9/library/venv.html#module-venv) предоставляет поддержку создания легковесных «виртуальных окружений» со своими собственными каталогами сайт-пакетов, опционально изолированными от системных каталогов сайт-пакетов. Каждое виртуальное окружение имеет свой собственный двоичный файл Python (который соответствует версии двоичного файла, использованного для создания этого окружения) и может иметь свой независимый набор установленных пакетов Python в своих каталогах сайт-пакетов.1617За дополнительной информацией о виртуальных окружениях Python обращайтесь к [**PEP 405**](https://python-all.ru/3.9/library/venv.html).1819> **См. также**20>21> [Руководство пользователя по упаковке Python: создание и использование виртуальных окружений](https://python-all.ru/3.9/library/venv.html)2223## Создание виртуальных окружений2425Создание [виртуальных окружений](https://python-all.ru/3.9/library/venv.html#venv-def) выполняется с помощью команды `venv`:2627```python28python3 -m venv /path/to/new/virtual/environment29```3031Выполнение этой команды создает целевой каталог (создавая все родительские каталоги, которые еще не существуют) и помещает в него файл `pyvenv.cfg` с ключом `home`, указывающим на установку Python, из которой была запущена команда (обычное имя для целевого каталога – `.venv`). Она также создает подкаталог `bin` (или `Scripts` в Windows), содержащий копию или символическую ссылку на бинарные файлы Python (в зависимости от платформы или аргументов, использованных при создании окружения). Также создается (изначально пустой) подкаталог `lib/pythonX.Y/site-packages` (в Windows это `Lib\site-packages`). Если указан существующий каталог, он будет повторно использован.3233Устарело с версии 3.6: `pyvenv` был рекомендованным инструментом для создания виртуальных окружений в Python 3.3 и 3.4, и [объявлен устаревшим в Python 3.6](https://python-all.ru/3.9/dev/whatsnew/3.6.html#deprecated-features).3435Изменено в версии 3.5: Теперь для создания виртуальных окружений рекомендуется использовать `venv`.3637В Windows команда `venv` выполняется следующим образом:3839```text40c:\>c:\Python35\python -m venv c:\path\to\myenv41```4243Альтернативно, если вы настроили переменные `PATH` и `PATHEXT` для вашей [установки Python](https://python-all.ru/3.9/using/windows.html#using-on-windows):4445```text46c:\>python -m venv c:\path\to\myenv47```4849При запуске с флагом `-h` команда отображает доступные параметры:5051```text52usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]53            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]54            ENV_DIR [ENV_DIR ...]5556Creates virtual Python environments in one or more target directories.5758positional arguments:59  ENV_DIR               A directory to create the environment in.6061optional arguments:62  -h, --help            show this help message and exit63  --system-site-packages64                        Give the virtual environment access to the system65                        site-packages dir.66  --symlinks            Try to use symlinks rather than copies, when symlinks67                        are not the default for the platform.68  --copies              Try to use copies rather than symlinks, even when69                        symlinks are the default for the platform.70  --clear               Delete the contents of the environment directory if it71                        already exists, before environment creation.72  --upgrade             Upgrade the environment directory to use this version73                        of Python, assuming Python has been upgraded in-place.74  --without-pip         Skips installing or upgrading pip in the virtual75                        environment (pip is bootstrapped by default)76  --prompt PROMPT       Provides an alternative prompt prefix for this77                        environment.78  --upgrade-deps        Upgrade core dependencies: pip setuptools to the79                        latest version in PyPI8081Once an environment has been created, you may wish to activate it, e.g. by82sourcing an activate script in its bin directory.83```8485Изменено в версии 3.9: Добавлена опция `--upgrade-deps` для обновления pip и setuptools до последних версий на PyPI8687Изменено в версии 3.4: По умолчанию устанавливается pip, добавлены опции `--without-pip` и `--copies`8889Изменено в версии 3.4: В более ранних версиях, если целевой каталог уже существовал, возникала ошибка, если не была предоставлена опция `--clear` или `--upgrade`.9091> **Примечание**92>93> Хотя символические ссылки поддерживаются в Windows, они не рекомендуются. Особенно важно отметить, что двойной щелчок по `python.exe` в Проводнике разрешит символьную ссылку немедленно и проигнорирует виртуальное окружение.9495> **Примечание**96>97> В Microsoft Windows может потребоваться включить сценарий `Activate.ps1`, установив политику выполнения для пользователя. Это можно сделать, выполнив следующую команду PowerShell:98>99> PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser100>101> См. [О политиках выполнения](https://python-all.ru/3.9/library/venv.html) для получения дополнительной информации.102103Созданный файл `pyvenv.cfg` также включает ключ `include-system-site-packages`, установленный в `true`, если `venv` запущен с опцией `--system-site-packages`, и в `false` в противном случае.104105Если не указана опция `--without-pip`, будет вызван [`ensurepip`](https://python-all.ru/3.9/library/ensurepip.html#module-ensurepip) для начальной установки `pip` в виртуальное окружение.106107Можно указать несколько путей для `venv`, в этом случае будет создано идентичное виртуальное окружение с заданными опциями для каждого указанного пути.108109После создания виртуального окружения его можно «активировать» с помощью скрипта в каталоге исполняемых файлов виртуального окружения. Вызов скрипта зависит от платформы (*\<venv\>* необходимо заменить на путь к каталогу, содержащему виртуальное окружение):110111| Платформа | Оболочка | Команда активации виртуального окружения |112| --- | --- | --- |113| POSIX | bash/zsh | $ source \<venv\>/bin/activate |114|  | fish | $ source \<venv\>/bin/activate.fish |115|  | csh/tcsh | $ source \<venv\>/bin/activate.csh |116|  | PowerShell Core | $ \<venv\>/bin/Activate.ps1 |117| Windows | cmd.exe | C:\\\> \<venv\>\\Scripts\\activate.bat |118|  | PowerShell | PS C:\\\> \<venv\>\\Scripts\\Activate.ps1 |119120Когда виртуальное окружение активно, переменная окружения `VIRTUAL_ENV` устанавливается в путь к виртуальному окружению. Это можно использовать для проверки, работает ли программа внутри виртуального окружения.121122Активировать окружение *не обязательно*; активация просто добавляет каталог исполняемых файлов виртуального окружения в начало вашего PATH, так что «python» запускает интерпретатор Python из виртуального окружения, и вы можете запускать установленные скрипты без указания полного пути. Однако все скрипты, установленные в виртуальном окружении, должны быть запускаемы без его активации и будут автоматически использовать Python из виртуального окружения.123124Деактивировать виртуальное окружение можно, введя «deactivate» в оболочке. Точный механизм зависит от платформы и является внутренней деталью реализации (обычно используется скрипт или функция оболочки).125126Новое в версии 3.4: `fish` и `csh` скрипты активации.127128Новое в версии 3.8: Скрипты активации PowerShell устанавливаются в POSIX для поддержки PowerShell Core.129130> **Примечание**131>132> Виртуальное окружение – это среда Python, в которой интерпретатор Python, библиотеки и скрипты, установленные в неё, изолированы от установленных в других виртуальных окружениях, а также (по умолчанию) от любых библиотек, установленных в «системном» Python, то есть в Python, установленном как часть вашей операционной системы.133>134> Виртуальное окружение – это дерево каталогов, содержащее исполняемые файлы Python и другие файлы, указывающие на то, что это виртуальное окружение.135>136> Распространённые инструменты установки, такие как [setuptools](https://python-all.ru/3.9/library/venv.html) и [pip](https://python-all.ru/3.9/library/venv.html), корректно работают с виртуальными окружениями. Другими словами, когда виртуальное окружение активно, они устанавливают пакеты Python в виртуальное окружение без необходимости явного указания.137>138> Когда виртуальное окружение активно (т.е. запущен интерпретатор Python из виртуального окружения), атрибуты [`sys.prefix`](https://python-all.ru/3.9/library/sys.html#sys.prefix) и [`sys.exec_prefix`](https://python-all.ru/3.9/library/sys.html#sys.exec_prefix) указывают на базовый каталог виртуального окружения, тогда как [`sys.base_prefix`](https://python-all.ru/3.9/library/sys.html#sys.base_prefix) и [`sys.base_exec_prefix`](https://python-all.ru/3.9/library/sys.html#sys.base_exec_prefix) указывают на установку Python вне виртуального окружения, которая использовалась для создания виртуального окружения. Если виртуальное окружение не активно, то [`sys.prefix`](https://python-all.ru/3.9/library/sys.html#sys.prefix) совпадает с [`sys.base_prefix`](https://python-all.ru/3.9/library/sys.html#sys.base_prefix), а [`sys.exec_prefix`](https://python-all.ru/3.9/library/sys.html#sys.exec_prefix) совпадает с [`sys.base_exec_prefix`](https://python-all.ru/3.9/library/sys.html#sys.base_exec_prefix) (все они указывают на установку Python вне виртуального окружения).139>140> Когда виртуальное окружение активно, любые параметры, изменяющие путь установки, будут игнорироваться во всех файлах конфигурации [`distutils`](https://python-all.ru/3.9/library/distutils.html#module-distutils), чтобы предотвратить непреднамеренную установку проектов за пределами виртуального окружения.141>142> При работе в командной оболочке пользователи могут активировать виртуальное окружение, запустив скрипт `activate` в каталоге исполняемых файлов виртуального окружения (точное имя файла и команда для его использования зависят от оболочки), который добавляет каталог исполняемых файлов виртуального окружения в начало переменной окружения `PATH` для текущей оболочки. В других случаях активировать виртуальное окружение не требуется; скрипты, установленные в виртуальные окружения, содержат строку shebang, указывающую на интерпретатор Python из виртуального окружения. Это означает, что скрипт будет выполняться этим интерпретатором независимо от значения `PATH`. В Windows обработка строки shebang поддерживается, если установлен Python Launcher для Windows (это было добавлено в Python 3.3 – см. [**PEP 397**](https://python-all.ru/3.9/library/venv.html) для подробностей). Таким образом, двойной щелчок по установленному скрипту в окне Проводника Windows должен запускать скрипт с правильным интерпретатором без необходимости ссылаться на его виртуальное окружение в `PATH`.143144## API145146Описанный выше высокоуровневый метод использует простой API, предоставляющий механизмы для создателей сторонних виртуальных окружений, чтобы настраивать создание окружения по своему усмотрению – класс [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder).147148#### `class venv.EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, upgrade_deps=False)`149150Класс [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder) принимает следующие именованные аргументы при создании экземпляра:151152- `system_site_packages` – логическое значение, указывающее, что системные site-packages Python должны быть доступны окружению (по умолчанию `False`).153- `clear` – логическое значение: если истинно, удаляет содержимое любого существующего целевого каталога перед созданием окружения.154- `symlinks` – логическое значение, указывающее, следует ли пытаться создать символическую ссылку на бинарный файл Python вместо копирования.155- `upgrade` – логическое значение: если истинно, обновляет существующее окружение с текущим Python – для использования, когда этот Python был обновлен на месте (по умолчанию `False`).156- `with_pip` – логическое значение: если истинно, гарантирует установку pip в виртуальное окружение. Для этого используется [`ensurepip`](https://python-all.ru/3.9/library/ensurepip.html#module-ensurepip) с опцией `--default-pip`.157- `prompt` – строка, используемая после активации виртуального окружения (по умолчанию `None`, что означает, что будет использовано имя каталога окружения). Если указана специальная строка `"."`, в качестве приглашения используется имя текущего каталога.158- `upgrade_deps` – Обновляет базовые модули venv до последних на PyPI159160Изменено в версии 3.4: Добавлен параметр `with_pip`161162Новое в версии 3.6: Добавлен параметр `prompt`163164Новое в версии 3.9: Добавлен параметр `upgrade_deps`165166Создатели сторонних инструментов для виртуальных окружений могут свободно использовать предоставленный класс [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder) в качестве базового класса.167168Возвращаемый env-builder – это объект, у которого есть метод `create`:169170#### `create(env_dir)`171172Создаёт виртуальное окружение путём указания целевого каталога (абсолютного или относительного по отношению к текущему каталогу), который будет содержать виртуальное окружение. Метод `create` либо создаст окружение в указанном каталоге, либо вызовет соответствующее исключение.173174Метод `create` класса [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder) иллюстрирует точки расширения, доступные для настройки в подклассах:175176```python177def create(self, env_dir):178    """179    Создаёт виртуализированное окружение Python в указанном каталоге.180    Параметр env_dir – это целевой каталог, в котором создаётся окружение.181    """182    env_dir = os.path.abspath(env_dir)183    context = self.ensure_directories(env_dir)184    self.create_configuration(context)185    self.setup_python(context)186    self.setup_scripts(context)187    self.post_setup(context)188```189190Каждый из методов [`ensure_directories()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.ensure_directories), [`create_configuration()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.create_configuration), [`setup_python()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.setup_python), [`setup_scripts()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.setup_scripts) и [`post_setup()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.post_setup) может быть переопределён.191192#### `ensure_directories(env_dir)`193194Создаёт каталог окружения и все необходимые каталоги, а затем возвращает объект контекста. Это просто контейнер для атрибутов (например, путей), используемый другими методами. Каталоги могут уже существовать, при условии, что были указаны `clear` или `upgrade`, чтобы разрешить работу с существующим каталогом окружения.195196#### `create_configuration(context)`197198Создаёт файл конфигурации `pyvenv.cfg` в окружении.199200#### `setup_python(context)`201202Создаёт копию или символическую ссылку на исполняемый файл Python в окружении. В системах POSIX, если был указан конкретный исполняемый файл `python3.x`, будут созданы символические ссылки на `python` и `python3`, указывающие на этот исполняемый файл, если файлы с такими именами уже не существуют.203204#### `setup_scripts(context)`205206Устанавливает скрипты активации, соответствующие платформе, в виртуальное окружение.207208#### `upgrade_dependencies(context)`209210Обновляет основные пакеты зависимостей venv (в настоящее время `pip` и `setuptools`) в окружении. Для этого вызывается исполняемый файл `pip` внутри окружения.211212Новое в версии 3.9.213214#### `post_setup(context)`215216Метод-заглушка, который может быть переопределён в сторонних реализациях для предварительной установки пакетов в виртуальное окружение или выполнения других действий после создания.217218Изменено в версии 3.7.2: В Windows теперь используются скрипты-перенаправители для `python[w].exe` вместо копирования самих исполняемых файлов. В версии 3.7.2 только [`setup_python()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.setup_python) ничего не делает, если не запущен из сборки в исходном дереве.219220Изменено в версии 3.7.3: В Windows скрипты-перенаправители копируются как часть [`setup_python()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.setup_python) вместо [`setup_scripts()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.setup_scripts). В версии 3.7.2 это было не так. При использовании символьных ссылок будут связаны исходные исполняемые файлы.221222Кроме того, [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder) предоставляет этот вспомогательный метод, который можно вызвать из [`setup_scripts()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.setup_scripts) или [`post_setup()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.post_setup) в подклассах для установки пользовательских скриптов в виртуальное окружение.223224#### `install_scripts(context, path)`225226*path* – это путь к каталогу, который должен содержать подкаталоги «common», «posix», «nt», каждый из которых содержит скрипты, предназначенные для каталога bin в окружении. Содержимое «common» и каталога, соответствующего [`os.name`](https://python-all.ru/3.9/library/os.html#os.name), копируется после замены некоторых текстовых плейсхолдеров:227228- `__VENV_DIR__` заменяется на абсолютный путь к каталогу окружения.229- `__VENV_NAME__` заменяется на имя окружения (последний сегмент пути к каталогу окружения).230- `__VENV_PROMPT__` заменяется на приглашение (имя окружения в скобках и с последующим пробелом)231- `__VENV_BIN_NAME__` заменяется на имя каталога bin ( `bin` или `Scripts`).232- `__VENV_PYTHON__` заменяется на абсолютный путь к исполняемому файлу окружения.233234Каталоги могут существовать (на случай, когда обновляется существующее окружение).235236Также существует удобная функция уровня модуля:237238#### `venv.create(env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None)`239240Создаёт экземпляр [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder) с заданными именованными аргументами и вызывает его метод [`create()`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder.create) с аргументом *env\_dir*.241242Новое в версии 3.3.243244Изменено в версии 3.4: Добавлен параметр `with_pip`245246Изменено в версии 3.6: Добавлен параметр `prompt`247248## Пример расширения `EnvBuilder`249250Следующий скрипт показывает, как расширить [`EnvBuilder`](https://python-all.ru/3.9/library/venv.html#venv.EnvBuilder), реализовав подкласс, который устанавливает setuptools и pip в созданное виртуальное окружение:251252```python253import os254import os.path255from subprocess import Popen, PIPE256import sys257from threading import Thread258from urllib.parse import urlparse259from urllib.request import urlretrieve260import venv261262class ExtendedEnvBuilder(venv.EnvBuilder):263    """264    Данный построитель устанавливает setuptools и pip, чтобы с их помощью можно было265    устанавливать другие пакеты в созданное виртуальное окружение командой pip или easy_install.266267    :param nodist: Если истина, setuptools и pip не устанавливаются в268                   созданное виртуальное окружение.269    :param nopip: Если истина, pip не устанавливается в созданное270                  виртуальное окружение.271    :param progress: Если setuptools или pip устанавливаются, за ходом установки272                     можно следить, передав вызываемый объект для отслеживания прогресса.273                     Если он указан, то вызывается с двумя274                     аргументами: строкой, описывающей текущий этап, и275                     контекстом, указывающим, откуда пришла эта строка.276                     Аргумент context может принимать одно из трёх значений:277                     'main' – вызов происходит из самой virtualize(),278                     а также 'stdout' и 'stderr' – строки берутся279                     из потоков вывода подпроцесса, который280                     используется для установки приложения.281282                     Если вызываемый объект не указан, по умолчанию сведения о ходе выполнения283                     выводятся в sys.stderr.284    """285286    def __init__(self, *args, **kwargs):287        self.nodist = kwargs.pop('nodist', False)288        self.nopip = kwargs.pop('nopip', False)289        self.progress = kwargs.pop('progress', None)290        self.verbose = kwargs.pop('verbose', False)291        super().__init__(*args, **kwargs)292293    def post_setup(self, context):294        """295        Устанавливает пакеты, которые необходимо предварительно установить в создаваемое виртуальное окружение.296        создаваемое виртуальное окружение297298        обрабатываемого запроса на создание виртуального окружения299                        запрос на создание обрабатывается300        """301        os.environ['VIRTUAL_ENV'] = context.env_dir302        if not self.nodist:303            self.install_setuptools(context)304        # Читает строки из потока вывода подпроцесса и либо передаёт их вызываемому объекту для отслеживания хода выполнения305        if not self.nopip and not self.nodist:306            self.install_pip(context)307308    def reader(self, stream, context):309        """310        Читает строки из потока вывода подпроцесса и передаёт их в индикатор прогресса311        Загружает скрипт в папку с бинарными файлами виртуального окружения312        """313        progress = self.progress314        while True:315            s = stream.readline()316            if not s:317                break318            if progress is not None:319                progress(s, context)320            else:321                if not self.verbose:322                    sys.stderr.write('.')323                else:324                    sys.stderr.write(s.decode('utf-8'))325                sys.stderr.flush()326        stream.close()327328    def install_script(self, context, name, url):329        _, _, path, _, _, _ = urlparse(url)330        fn = os.path.split(path)[-1]331        binpath = context.bin_path332        distpath = os.path.join(binpath, fn)333        # Устанавливает в виртуальное окружение334        urlretrieve(url, distpath)335        progress = self.progress336        if self.verbose:337            term = '\n'338        else:339            term = ''340        if progress is not None:341            progress('Installing %s ...%s' % (name, term), 'main')342        else:343            sys.stderr.write('Installing %s ...%s' % (name, term))344            sys.stderr.flush()345        # Очистка – больше не требуется346        args = [context.env_exe, fn]347        p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)348        t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))349        t1.start()350        t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))351        t2.start()352        p.wait()353        t1.join()354        t2.join()355        if progress is not None:356            progress('done.', 'main')357        else:358            sys.stderr.write('done.\n')359        # Очищает – больше не требуется360        os.unlink(distpath)361362    def install_setuptools(self, context):363        """364        Устанавливает setuptools в виртуальное окружение365366        обрабатываемого запроса на создание виртуального окружения367                        запрос на создание обрабатывается368        """369        url = 'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py'370        self.install_script(context, 'setuptools', url)371        # Устанавливает pip в виртуальное окружение.372        pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')373        files = filter(pred, os.listdir(context.bin_path))374        for f in files:375            f = os.path.join(context.bin_path, f)376            os.unlink(f)377378    def install_pip(self, context):379        """380        Устанавливает pip в виртуальное окружение381382        обрабатываемого запроса на создание виртуального окружения383                        запрос на создание обрабатывается384        """385        url = 'https://bootstrap.pypa.io/get-pip.py'386        self.install_script(context, 'pip', url)387388def main(args=None):389    compatible = True390    if sys.version_info < (3, 3):391        compatible = False392    elif not hasattr(sys, 'base_prefix'):393        compatible = False394    if not compatible:395        raise ValueError('This script is only for use with '396                         'Python 3.3 or later')397    else:398        import argparse399400        parser = argparse.ArgumentParser(prog=__name__,401                                         description='Creates virtual Python '402                                                     'environments in one or '403                                                     'more target '404                                                     'directories.')405        parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',406                            help='A directory in which to create the '407                                 'virtual environment.')408        parser.add_argument('--no-setuptools', default=False,409                            action='store_true', dest='nodist',410                            help="Don't install setuptools or pip in the "411                                 "virtual environment.")412        parser.add_argument('--no-pip', default=False,413                            action='store_true', dest='nopip',414                            help="Don't install pip in the virtual "415                                 "environment.")416        parser.add_argument('--system-site-packages', default=False,417                            action='store_true', dest='system_site',418                            help='Give the virtual environment access to the '419                                 'system site-packages dir.')420        if os.name == 'nt':421            use_symlinks = False422        else:423            use_symlinks = True424        parser.add_argument('--symlinks', default=use_symlinks,425                            action='store_true', dest='symlinks',426                            help='Try to use symlinks rather than copies, '427                                 'when symlinks are not the default for '428                                 'the platform.')429        parser.add_argument('--clear', default=False, action='store_true',430                            dest='clear', help='Delete the contents of the '431                                               'virtual environment '432                                               'directory if it already '433                                               'exists, before virtual '434                                               'environment creation.')435        parser.add_argument('--upgrade', default=False, action='store_true',436                            dest='upgrade', help='Upgrade the virtual '437                                                 'environment directory to '438                                                 'use this version of '439                                                 'Python, assuming Python '440                                                 'has been upgraded '441                                                 'in-place.')442        parser.add_argument('--verbose', default=False, action='store_true',443                            dest='verbose', help='Display the output '444                                               'from the scripts which '445                                               'install setuptools and pip.')446        options = parser.parse_args(args)447        if options.upgrade and options.clear:448            raise ValueError('you cannot supply --upgrade and --clear together.')449        builder = ExtendedEnvBuilder(system_site_packages=options.system_site,450                                       clear=options.clear,451                                       symlinks=options.symlinks,452                                       upgrade=options.upgrade,453                                       nodist=options.nodist,454                                       nopip=options.nopip,455                                       verbose=options.verbose)456        for d in options.dirs:457            builder.create(d)458459if __name__ == '__main__':460    rc = 1461    try:462        main()463        rc = 0464    except Exception as e:465        print('Error: %s' % e, file=sys.stderr)466    sys.exit(rc)467```468469Этот скрипт также доступен для загрузки [онлайн](https://python-all.ru/3.9/library/venv.html).470