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
.venvodervenvim 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.
- --symlinks¶
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 |
|
fish |
|
|
csh/tcsh |
|
|
pwsh |
|
|
Windows |
cmd.exe |
|
PowerShell |
|
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
EnvBuilderakzeptiert folgende Schlüsselwortargumente bei der Instanziierungsystem_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
ensurepipmit 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_filedefiniert. Der einzige standardmäßig unterstützte Wert ist"git"übercreate_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.EnvBuilderkann 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
createerstellt entweder die Umgebung im angegebenen Verzeichnis oder löst eine entsprechende Ausnahme aus.Die Methode
createder KlasseEnvBuilderillustriert die Hooks für die Anpassung durch Unterklassendef 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()undpost_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
EnvBuildermit dem Argumentclear=Trueinstanziiert wurde, wird der Inhalt des Umgebungsverzeichnisses gelöscht und dann werden alle notwendigen Unterverzeichnisse neu erstellt.Das zurückgegebene Kontextobjekt ist ein
types.SimpleNamespacemit den folgenden Attributenenv_dir- Der Speicherort der virtuellen Umgebung. Wird für__VENV_DIR__in den Aktivierungsskripten verwendet (sieheinstall_scripts()).env_name- Der Name der virtuellen Umgebung. Wird für__VENV_NAME__in den Aktivierungsskripten verwendet (sieheinstall_scripts()).prompt- Der Prompt, der von den Aktivierungsskripten verwendet wird. Wird für__VENV_PROMPT__in den Aktivierungsskripten verwendet (sieheinstall_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 (sieheinstall_scripts()).env_exe- Der Name des Python-Interpreters in der virtuellen Umgebung. Wird für__VENV_PYTHON__in den Aktivierungsskripten verwendet (sieheinstall_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_pathwurde dem Kontext hinzugefügt und das Kontextobjekt dokumentiert.
- create_configuration(context)¶
Erstellt die Konfigurationsdatei
pyvenv.cfgin 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.xverwendet wurde, Symlinks zupythonundpython3erstellt, 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()oderpost_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,ntenthalten sollte; jedes enthält Skripte, die für dasbin-Verzeichnis in der Umgebung bestimmt sind. Der Inhalt voncommonund des Verzeichnisses, dasos.nameentspricht, 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 (entwederbinoderScripts).__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].exeanstelle des Kopierens der tatsächlichen Binärdateien. In 3.7.2 tutsetup_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 vonsetup_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
EnvBuildermit den gegebenen Schlüsselwortargumenten und ruft dessencreate()-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.