venv — Erstellung von virtuellen Umgebungen

Hinzugefügt in Version 3.3.

Quellcode: Lib/venv/


Das Modul venv unterstützt die Erstellung von leichtgewichtigen „virtuellen Umgebungen“, jede mit ihrem eigenen, unabhängigen Satz von Python-Paketen, die in ihren site-Verzeichnissen installiert sind. Eine virtuelle Umgebung wird auf einer bestehenden Python-Installation aufgebaut, die als „Basis“-Python der virtuellen Umgebung bezeichnet wird. Standardmäßig ist sie von den Paketen in der Basisumgebung isoliert, sodass nur die explizit in der virtuellen Umgebung installierten Pakete verfügbar sind. Weitere Informationen finden Sie unter Virtuelle Umgebungen und in der site-Dokumentation zu virtuellen Umgebungen.

Wenn gängige Installationstools wie pip innerhalb einer virtuellen Umgebung verwendet werden, werden Python-Pakete in die virtuelle Umgebung installiert, ohne dass dies explizit angegeben werden muss.

Eine virtuelle Umgebung ist (unter anderem)

  • dazu gedacht, einen spezifischen Python-Interpreter sowie Softwarebibliotheken und -binärdateien zu enthalten, die zur Unterstützung eines Projekts (Bibliothek oder Anwendung) benötigt werden. Diese sind standardmäßig von Software in anderen virtuellen Umgebungen und von auf dem Betriebssystem installierten Python-Interpretern und -Bibliotheken isoliert.

  • in einem Verzeichnis enthalten, das konventionell .venv oder venv im Projektverzeichnis genannt wird, oder unter einem Container-Verzeichnis für viele virtuelle Umgebungen, wie z. B. ~/.virtualenvs.

  • nicht in Quellcodeverwaltungssysteme wie Git eingecheckt.

  • als wegwerfbar betrachtet – es sollte einfach sein, sie zu löschen und von Grund auf neu zu erstellen. Sie legen keinen Projektcode in der Umgebung ab.

  • nicht als verschieb- oder kopierbar betrachtet – Sie erstellen die gleiche Umgebung einfach am Zielort neu.

Weitere Hintergrundinformationen zu Python-virtuellen Umgebungen finden Sie in PEP 405.

Verfügbarkeit: nicht Android, nicht iOS, nicht WASI.

Dieses Modul wird auf mobilen Plattformen oder WebAssembly-Plattformen nicht unterstützt.

Erstellung von virtuellen Umgebungen

Virtuelle Umgebungen werden durch Ausführen des venv-Moduls erstellt

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

Dies erstellt das Zielverzeichnis (einschließlich übergeordneter Verzeichnisse nach Bedarf) und platziert darin eine Datei pyvenv.cfg mit einem Schlüssel home, der auf die Python-Installation zeigt, von der aus der Befehl ausgeführt wurde. Es erstellt außerdem ein Unterverzeichnis bin (oder Scripts unter Windows), das eine Kopie oder einen Symlink der Python-Executable enthält (entsprechend der Plattform oder den beim Erstellen der Umgebung verwendeten Argumenten). Außerdem wird ein Unterverzeichnis lib/pythonX.Y/site-packages erstellt (unter Windows ist dies Lib\site-packages). Wenn ein vorhandenes Verzeichnis angegeben wird, wird es wiederverwendet.

Geändert in Version 3.5: Die Verwendung von venv wird nun zur Erstellung virtueller Umgebungen empfohlen.

Veraltet seit Version 3.6, entfernt in Version 3.8: pyvenv war das empfohlene Werkzeug zur Erstellung virtueller Umgebungen für Python 3.3 und 3.4 und wurde in Version 3.5 durch die direkte Ausführung von venv ersetzt.

Unter Windows rufen Sie den Befehl venv wie folgt auf

PS> python -m venv C:\path\to\new\virtual\environment

Der Befehl zeigt, wenn er mit -h ausgeführt wird, die verfügbaren Optionen an

usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
            [--without-scm-ignore-files]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.
ENV_DIR

Ein erforderliches Argument, das das Verzeichnis angibt, in dem die Umgebung erstellt werden soll.

--system-site-packages

Gewährt der virtuellen Umgebung Zugriff auf das Verzeichnis der systemweiten site-packages.

Versucht, Symlinks anstelle von Kopien zu verwenden, wenn Symlinks für die Plattform nicht Standard sind.

--copies

Versucht, Kopien anstelle von Symlinks zu verwenden, auch wenn Symlinks für die Plattform Standard sind.

--clear

Löscht den Inhalt des Umgebungsverzeichnisses, falls es bereits existiert, vor der Erstellung der Umgebung.

--upgrade

Aktualisiert das Umgebungsverzeichnis, um diese Python-Version zu verwenden, vorausgesetzt, Python wurde an Ort und Stelle aktualisiert.

--without-pip

Überspringt die Installation oder Aktualisierung von pip in der virtuellen Umgebung (pip wird standardmäßig gebootstrapped).

--prompt <PROMPT>

Bietet ein alternatives Prompt-Präfix für diese Umgebung.

--upgrade-deps

Aktualisiert die Kernabhängigkeiten (pip) auf die neueste Version auf PyPI.

--without-scm-ignore-files

Überspringt das Hinzufügen von SCM-Ignore-Dateien zum Umgebungsverzeichnis (Git wird standardmäßig unterstützt).

Geändert in Version 3.4: Installiert pip standardmäßig, hinzugefügt wurden die Optionen --without-pip und --copies.

Geändert in Version 3.4: In früheren Versionen wurde ein Fehler ausgelöst, wenn das Zielverzeichnis bereits existierte, es sei denn, die Option --clear oder --upgrade wurde bereitgestellt.

Geändert in Version 3.9: Hinzufügen der Option --upgrade-deps zur Aktualisierung von pip + setuptools auf die neueste Version auf PyPI.

Geändert in Version 3.12: setuptools ist keine Kernabhängigkeit von venv mehr.

Geändert in Version 3.13: Hinzufügen der Option --without-scm-ignore-files.

Geändert in Version 3.13: venv erstellt standardmäßig eine .gitignore-Datei für Git.

Hinweis

Obwohl Symlinks unter Windows unterstützt werden, werden sie nicht empfohlen. Insbesondere wird beim Doppelklick auf python.exe im Explorer der Symlink sofort aufgelöst und die virtuelle Umgebung ignoriert.

Hinweis

Unter Microsoft Windows kann es erforderlich sein, das Skript Activate.ps1 durch Festlegen der Ausführungsrichtlinie für den Benutzer zu aktivieren. Sie können dies tun, indem Sie den folgenden PowerShell-Befehl ausführen

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

Weitere Informationen finden Sie unter About Execution Policies.

Die erstellte Datei pyvenv.cfg enthält auch den Schlüssel include-system-site-packages, der auf true gesetzt ist, wenn venv mit der Option --system-site-packages ausgeführt wird, andernfalls auf false.

Sofern nicht die Option --without-pip angegeben wird, wird ensurepip aufgerufen, um pip in die virtuelle Umgebung zu bootstappen.

Mehrere Pfade können an venv übergeben werden, in diesem Fall wird gemäß den angegebenen Optionen an jedem bereitgestellten Pfad eine identische virtuelle Umgebung erstellt.

Wie venvs funktionieren

Wenn ein Python-Interpreter aus einer virtuellen Umgebung ausgeführt wird, zeigen sys.prefix und sys.exec_prefix auf die Verzeichnisse der virtuellen Umgebung, während sys.base_prefix und sys.base_exec_prefix auf die der Basis-Python-Installation zeigen, die zur Erstellung der Umgebung verwendet wurde. Es genügt, sys.prefix != sys.base_prefix zu überprüfen, um festzustellen, ob der aktuelle Interpreter aus einer virtuellen Umgebung ausgeführt wird.

Eine virtuelle Umgebung kann mit einem Skript in ihrem Binärverzeichnis (bin unter POSIX; Scripts unter Windows) „aktiviert“ werden. Dies fügt dieses Verzeichnis am Anfang Ihrer PATH-Umgebungsvariable ein, sodass die Ausführung von python den Python-Interpreter der Umgebung aufruft und Sie installierte Skripte ausführen können, ohne deren vollständigen Pfad angeben zu müssen. Der Aufruf des Aktivierungsskripts ist plattformabhängig (<venv> muss durch den Pfad zum Verzeichnis ersetzt werden, das die virtuelle Umgebung enthält)

Plattform

Shell

Befehl zur Aktivierung der virtuellen Umgebung

POSIX

bash/zsh

$ source <venv>/bin/activate

fish

$ source <venv>/bin/activate.fish

csh/tcsh

$ source <venv>/bin/activate.csh

pwsh

$ <venv>/bin/Activate.ps1

Windows

cmd.exe

C:\> <venv>\Scripts\activate.bat

PowerShell

PS C:\> <venv>\Scripts\Activate.ps1

Hinzugefügt in Version 3.4: Aktivierungsskripte für fish und csh.

Hinzugefügt in Version 3.8: PowerShell-Aktivierungsskripte, die unter POSIX für PowerShell Core-Unterstützung installiert wurden.

Sie müssen eine virtuelle Umgebung nicht explizit aktivieren, da Sie einfach den vollständigen Pfad zum Python-Interpreter dieser Umgebung angeben können, wenn Sie Python aufrufen. Darüber hinaus sollten alle in der Umgebung installierten Skripte ohne Aktivierung ausführbar sein.

Um dies zu erreichen, haben Skripte, die in virtuelle Umgebungen installiert werden, eine „Shebang“-Zeile, die auf den Python-Interpreter der Umgebung verweist: #!/<path-to-venv>/bin/python. Das bedeutet, dass das Skript mit diesem Interpreter ausgeführt wird, unabhängig vom Wert von PATH. Unter Windows wird die „Shebang“-Zeilenverarbeitung unterstützt, wenn Sie den Python-Installationsmanager installiert haben. Daher sollte ein Doppelklick auf ein installiertes Skript in einem Windows-Explorer-Fenster es mit dem richtigen Interpreter ausführen, ohne dass die Umgebung aktiviert oder auf dem PATH liegen muss.

Wenn eine virtuelle Umgebung aktiviert wurde, wird die Umgebungsvariable VIRTUAL_ENV auf den Pfad der Umgebung gesetzt. Da die explizite Aktivierung einer virtuellen Umgebung nicht erforderlich ist, um sie zu nutzen, kann VIRTUAL_ENV nicht zuverlässig verwendet werden, um festzustellen, ob eine virtuelle Umgebung verwendet wird.

Warnung

Da Skripte, die in Umgebungen installiert werden, nicht davon ausgehen sollten, dass die Umgebung aktiviert ist, enthalten ihre Shebang-Zeilen die absoluten Pfade zu ihren Umgebungsinterpretern. Aus diesem Grund sind Umgebungen im Allgemeinen nicht portabel. Sie sollten immer eine einfache Möglichkeit haben, eine Umgebung neu zu erstellen (z. B. wenn Sie eine Requirements-Datei requirements.txt haben, können Sie pip install -r requirements.txt mit dem pip der Umgebung aufrufen, um alle für die Umgebung benötigten Pakete zu installieren). Wenn Sie aus irgendeinem Grund die Umgebung an einen neuen Speicherort verschieben müssen, sollten Sie sie am gewünschten Ort neu erstellen und die am alten Ort löschen. Wenn Sie eine Umgebung verschieben, weil Sie ein übergeordnetes Verzeichnis von ihr verschoben haben, sollten Sie die Umgebung an ihrem neuen Speicherort neu erstellen. Andernfalls funktionieren in der Umgebung installierte Software möglicherweise nicht wie erwartet.

Sie können eine virtuelle Umgebung deaktivieren, indem Sie deactivate in Ihrer Shell eingeben. Der genaue Mechanismus ist plattformspezifisch und ein internes Implementierungsdetail (typischerweise wird ein Skript oder eine Shell-Funktion verwendet).

API

Die oben beschriebene High-Level-Methode nutzt eine einfache API, die Mechanismen für Ersteller von virtuellen Umgebungen von Drittanbietern bietet, um die Umgebungsgestaltung nach ihren Bedürfnissen anzupassen: die Klasse EnvBuilder.

class venv.EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

Die Klasse EnvBuilder akzeptiert folgende Schlüsselwortargumente bei der Instanziierung

  • system_site_packages – ein boolescher Wert, der angibt, dass die systemweiten Python site-packages für die Umgebung verfügbar sein sollen (Standard ist False).

  • clear – ein boolescher Wert, der bei `True` den Inhalt eines vorhandenen Zielverzeichnisses löscht, bevor die Umgebung erstellt wird.

  • symlinks – ein boolescher Wert, der angibt, ob versucht werden soll, die Python-Executable per Symlink einzubinden anstatt sie zu kopieren.

  • upgrade – ein boolescher Wert, der bei `True` eine bestehende Umgebung mit dem aktuell laufenden Python aktualisiert – für den Fall, dass dieses Python an Ort und Stelle aktualisiert wurde (Standard ist False).

  • with_pip – ein boolescher Wert, der bei `True` sicherstellt, dass pip in der virtuellen Umgebung installiert ist. Dies verwendet ensurepip mit der Option --default-pip.

  • prompt – ein String, der nach der Aktivierung der virtuellen Umgebung verwendet wird (Standard ist None, was bedeutet, dass der Verzeichnisname der Umgebung verwendet wird). Wenn der spezielle String "." angegeben wird, wird der Basisname des aktuellen Verzeichnisses als Prompt verwendet.

  • upgrade_deps – Aktualisiert die Basis-venv-Module auf die neueste Version auf PyPI

  • scm_ignore_files – Erstellt Ignore-Dateien für die angegebenen Quellcodeverwaltungssysteme (SCM) im Iterable. Die Unterstützung wird durch eine Methode namens create_{scm}_ignore_file definiert. Der einzige standardmäßig unterstützte Wert ist "git" über create_git_ignore_file().

Geändert in Version 3.4: Hinzugefügt wurde der Parameter with_pip.

Geändert in Version 3.6: Hinzugefügt wurde der Parameter prompt.

Geändert in Version 3.9: Hinzugefügt wurde der Parameter upgrade_deps.

Geändert in Version 3.13: Hinzugefügt wurde der Parameter scm_ignore_files.

EnvBuilder kann als Basisklasse verwendet werden.

create(env_dir)

Erstellt eine virtuelle Umgebung, indem das Zielverzeichnis (absolut oder relativ zum aktuellen Verzeichnis) angegeben wird, das die virtuelle Umgebung enthalten soll. Die Methode create erstellt entweder die Umgebung im angegebenen Verzeichnis oder löst eine entsprechende Ausnahme aus.

Die Methode create der Klasse EnvBuilder illustriert die Hooks für die Anpassung durch Unterklassen

def create(self, env_dir):
    """
    Create a virtualized Python environment in a directory.
    env_dir is the target directory to create an environment in.
    """
    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)

Jede der Methoden ensure_directories(), create_configuration(), setup_python(), setup_scripts() und post_setup() kann überschrieben werden.

ensure_directories(env_dir)

Erstellt das Umgebungsverzeichnis und alle notwendigen Unterverzeichnisse, die noch nicht existieren, und gibt ein Kontextobjekt zurück. Dieses Kontextobjekt ist nur ein Container für Attribute (wie Pfade), die von den anderen Methoden verwendet werden. Wenn EnvBuilder mit dem Argument clear=True instanziiert wurde, wird der Inhalt des Umgebungsverzeichnisses gelöscht und dann werden alle notwendigen Unterverzeichnisse neu erstellt.

Das zurückgegebene Kontextobjekt ist ein types.SimpleNamespace mit den folgenden Attributen

  • env_dir - Der Speicherort der virtuellen Umgebung. Wird für __VENV_DIR__ in den Aktivierungsskripten verwendet (siehe install_scripts()).

  • env_name - Der Name der virtuellen Umgebung. Wird für __VENV_NAME__ in den Aktivierungsskripten verwendet (siehe install_scripts()).

  • prompt - Der Prompt, der von den Aktivierungsskripten verwendet wird. Wird für __VENV_PROMPT__ in den Aktivierungsskripten verwendet (siehe install_scripts()).

  • executable - Die zugrundeliegende Python-Executable, die von der virtuellen Umgebung verwendet wird. Dies berücksichtigt den Fall, dass eine virtuelle Umgebung aus einer anderen virtuellen Umgebung erstellt wird.

  • inc_path - Der Include-Pfad für die virtuelle Umgebung.

  • lib_path - Der reine Bibliotheks-Pfad für die virtuelle Umgebung.

  • bin_path - Der Skript-Pfad für die virtuelle Umgebung.

  • bin_name - Der Name des Skript-Pfads relativ zum Speicherort der virtuellen Umgebung. Wird für __VENV_BIN_NAME__ in den Aktivierungsskripten verwendet (siehe install_scripts()).

  • env_exe - Der Name des Python-Interpreters in der virtuellen Umgebung. Wird für __VENV_PYTHON__ in den Aktivierungsskripten verwendet (siehe install_scripts()).

  • env_exec_cmd - Der Name des Python-Interpreters, unter Berücksichtigung von Dateisystemumleitungen. Dies kann verwendet werden, um Python in der virtuellen Umgebung auszuführen.

Geändert in Version 3.11: Das sysconfig-Installationsschema von venv wird verwendet, um die Pfade der erstellten Verzeichnisse zu konstruieren.

Geändert in Version 3.12: Das Attribut lib_path wurde dem Kontext hinzugefügt und das Kontextobjekt dokumentiert.

create_configuration(context)

Erstellt die Konfigurationsdatei pyvenv.cfg in der Umgebung.

setup_python(context)

Erstellt eine Kopie oder einen Symlink zur Python-Executable in der Umgebung. Auf POSIX-Systemen werden, wenn eine spezifische Executable python3.x verwendet wurde, Symlinks zu python und python3 erstellt, die auf diese Executable zeigen, es sei denn, Dateien mit diesen Namen existieren bereits.

setup_scripts(context)

Installiert plattformspezifische Aktivierungsskripte in die virtuelle Umgebung.

upgrade_dependencies(context)

Aktualisiert die Kernabhängigkeitspakete von venv (derzeit pip) in der Umgebung. Dies geschieht durch Auslagern an die pip-Executable in der Umgebung.

Hinzugefügt in Version 3.9.

Geändert in Version 3.12: setuptools ist keine Kernabhängigkeit von venv mehr.

post_setup(context)

Eine Platzhalter-Methode, die in Drittanbieterimplementierungen überschrieben werden kann, um Pakete vorab in der virtuellen Umgebung zu installieren oder andere Schritte nach der Erstellung durchzuführen.

install_scripts(context, path)

Diese Methode kann von setup_scripts() oder post_setup() in Unterklassen aufgerufen werden, um bei der Installation benutzerdefinierter Skripte in die virtuelle Umgebung zu helfen.

path ist der Pfad zu einem Verzeichnis, das Unterverzeichnisse common, posix, nt enthalten sollte; jedes enthält Skripte, die für das bin-Verzeichnis in der Umgebung bestimmt sind. Der Inhalt von common und des Verzeichnisses, das os.name entspricht, werden nach einigen Textersetzungen von Platzhaltern kopiert

  • __VENV_DIR__ wird durch den absoluten Pfad des Umgebungsverzeichnisses ersetzt.

  • __VENV_NAME__ wird durch den Namen der Umgebung ersetzt (finaler Pfadsegment des Umgebungsverzeichnisses).

  • __VENV_PROMPT__ wird durch den Prompt ersetzt (der Name der Umgebung, umgeben von Klammern und mit einem folgenden Leerzeichen)

  • __VENV_BIN_NAME__ wird durch den Namen des Binärverzeichnisses ersetzt (entweder bin oder Scripts).

  • __VENV_PYTHON__ wird durch den absoluten Pfad der Executable der Umgebung ersetzt.

Die Verzeichnisse dürfen existieren (für den Fall, dass eine bestehende Umgebung aktualisiert wird).

create_git_ignore_file(context)

Erstellt eine .gitignore-Datei innerhalb der virtuellen Umgebung, die bewirkt, dass das gesamte Verzeichnis von der Git-Quellcodeverwaltung ignoriert wird.

Hinzugefügt in Version 3.13.

Geändert in Version 3.7.2: Windows verwendet nun Redirector-Skripte für python[w].exe anstelle des Kopierens der tatsächlichen Binärdateien. In 3.7.2 tut setup_python() nichts, es sei denn, es wird aus einem Build im Quellbaum ausgeführt.

Geändert in Version 3.7.3: Windows kopiert die Redirector-Skripte als Teil von setup_python() anstelle von setup_scripts(). Dies war in 3.7.2 nicht der Fall. Bei Verwendung von Symlinks werden die Original-Executables verlinkt.

Es gibt auch eine Modul-weite Hilfsfunktion

venv.create(env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

Erstellt einen EnvBuilder mit den gegebenen Schlüsselwortargumenten und ruft dessen create()-Methode mit dem Argument env_dir auf.

Hinzugefügt in Version 3.3.

Geändert in Version 3.4: Parameter with_pip hinzugefügt

Geändert in Version 3.6: Parameter prompt hinzugefügt

Geändert in Version 3.9: Parameter upgrade_deps hinzugefügt

Geändert in Version 3.13: Parameter scm_ignore_files hinzugefügt

Ein Beispiel für die Erweiterung von EnvBuilder

Das folgende Skript zeigt, wie EnvBuilder durch die Implementierung einer Unterklasse erweitert werden kann, die setuptools und pip in einer erstellten virtuellen Umgebung installiert.

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):
    """
    This builder installs setuptools and pip so that you can pip or
    easy_install other packages into the created virtual environment.

    :param nodist: If true, setuptools and pip are not installed into the
                   created virtual environment.
    :param nopip: If true, pip is not installed into the created
                  virtual environment.
    :param progress: If setuptools or pip are installed, the progress of the
                     installation can be monitored by passing a progress
                     callable. If specified, it is called with two
                     arguments: a string indicating some progress, and a
                     context indicating where the string is coming from.
                     The context argument can have one of three values:
                     'main', indicating that it is called from virtualize()
                     itself, and 'stdout' and 'stderr', which are obtained
                     by reading lines from the output streams of a subprocess
                     which is used to install the app.

                     If a callable is not specified, default progress
                     information is output to 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):
        """
        Set up any packages which need to be pre-installed into the
        virtual environment being created.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        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):
        """
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to 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)
        # Download script into the virtual environment's binaries folder
        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()
        # Install in the virtual environment
        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')
        # Clean up - no longer needed
        os.unlink(distpath)

    def install_setuptools(self, context):
        """
        Install setuptools in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = "https://bootstrap.pypa.io/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):
        """
        Install pip in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = 'https://bootstrap.pypa.io/get-pip.py'
        self.install_script(context, 'pip', url)


def main(args=None):
    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)

Dieses Skript ist auch online zum Download verfügbar.