summaryrefslogtreecommitdiffstats
path: root/Lib/venv
diff options
context:
space:
mode:
authorVinay Sajip <vinay_sajip@yahoo.co.uk>2012-05-26 02:45:29 (GMT)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>2012-05-26 02:45:29 (GMT)
commit7ded1f0f694f0f99252ea19eca18b74ea5e36cb0 (patch)
tree1f07c57fddc9627f3d506b7a8d25ded561f5a2e0 /Lib/venv
parentf2bdc3690a59ca2af3f2fa82f506350874ff1467 (diff)
downloadcpython-7ded1f0f694f0f99252ea19eca18b74ea5e36cb0.zip
cpython-7ded1f0f694f0f99252ea19eca18b74ea5e36cb0.tar.gz
cpython-7ded1f0f694f0f99252ea19eca18b74ea5e36cb0.tar.bz2
Implemented PEP 405 (Python virtual environments).
Diffstat (limited to 'Lib/venv')
-rw-r--r--Lib/venv/__init__.py502
-rw-r--r--Lib/venv/__main__.py10
-rw-r--r--Lib/venv/scripts/nt/Activate.ps134
-rw-r--r--Lib/venv/scripts/nt/Deactivate.ps119
-rw-r--r--Lib/venv/scripts/nt/activate.bat31
-rw-r--r--Lib/venv/scripts/nt/deactivate.bat17
-rw-r--r--Lib/venv/scripts/nt/pysetup3-script.py11
-rw-r--r--Lib/venv/scripts/nt/pysetup3.exebin0 -> 6144 bytes
-rw-r--r--Lib/venv/scripts/posix/activate76
-rw-r--r--Lib/venv/scripts/posix/pysetup311
10 files changed, 711 insertions, 0 deletions
diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
new file mode 100644
index 0000000..8c26fb1
--- /dev/null
+++ b/Lib/venv/__init__.py
@@ -0,0 +1,502 @@
+# Copyright (C) 2011-2012 Vinay Sajip.
+#
+# Use with a Python executable built from the Python fork at
+#
+# https://bitbucket.org/vinay.sajip/pythonv/ as follows:
+#
+# python -m venv env_dir
+#
+# You'll need an Internet connection (needed to download distribute_setup.py).
+#
+# The script will change to the environment's binary directory and run
+#
+# ./python distribute_setup.py
+#
+# after which you can change to the environment's directory and do some
+# installations, e.g.
+#
+# source bin/activate.sh
+# pysetup3 install setuptools-git
+# pysetup3 install Pygments
+# pysetup3 install Jinja2
+# pysetup3 install SQLAlchemy
+# pysetup3 install coverage
+#
+# Note that on Windows, distributions which include C extensions (e.g. coverage)
+# may fail due to lack of a suitable C compiler.
+#
+import base64
+import io
+import logging
+import os
+import os.path
+import shutil
+import sys
+import zipfile
+
+logger = logging.getLogger(__name__)
+
+class Context:
+ """
+ Holds information about a current virtualisation request.
+ """
+ pass
+
+
+class EnvBuilder:
+ """
+ This class exists to allow virtual environment creation to be
+ customised. The constructor parameters determine the builder's
+ behaviour when called upon to create a virtual environment.
+
+ By default, the builder makes the system (global) site-packages dir
+ available to the created environment.
+
+ By default, the creation process uses symlinks wherever possible.
+
+ :param system_site_packages: If True, the system (global) site-packages
+ dir is available to created environments.
+ :param clear: If True and the target directory exists, it is deleted.
+ Otherwise, if the target directory exists, an error is
+ raised.
+ :param symlinks: If True, attempt to symlink rather than copy files into
+ virtual environment.
+ :param upgrade: If True, upgrade an existing virtual environment.
+ """
+
+ def __init__(self, system_site_packages=False, clear=False,
+ symlinks=False, upgrade=False):
+ self.system_site_packages = system_site_packages
+ self.clear = clear
+ self.symlinks = symlinks
+ self.upgrade = upgrade
+
+ def create(self, env_dir):
+ """
+ Create a virtual environment in a directory.
+
+ :param env_dir: The target directory to create an environment in.
+
+ """
+ if (self.symlinks and
+ sys.platform == 'darwin' and
+ 'Library/Framework' in sys.base_prefix):
+ # Symlinking the stub executable in an OSX framework build will
+ # result in a broken virtual environment.
+ raise ValueError(
+ "Symlinking is not supported on OSX framework Python.")
+ env_dir = os.path.abspath(env_dir)
+ context = self.ensure_directories(env_dir)
+ self.create_configuration(context)
+ self.setup_python(context)
+ if not self.upgrade:
+ self.setup_scripts(context)
+ self.post_setup(context)
+
+ def ensure_directories(self, env_dir):
+ """
+ Create the directories for the environment.
+
+ Returns a context object which holds paths in the environment,
+ for use by subsequent logic.
+ """
+
+ def create_if_needed(d):
+ if not os.path.exists(d):
+ os.makedirs(d)
+
+ if os.path.exists(env_dir) and not (self.clear or self.upgrade):
+ raise ValueError('Directory exists: %s' % env_dir)
+ if os.path.exists(env_dir) and self.clear:
+ shutil.rmtree(env_dir)
+ context = Context()
+ context.env_dir = env_dir
+ context.env_name = os.path.split(env_dir)[1]
+ context.prompt = '(%s) ' % context.env_name
+ create_if_needed(env_dir)
+ env = os.environ
+ if sys.platform == 'darwin' and '__PYTHONV_LAUNCHER__' in env:
+ executable = os.environ['__PYTHONV_LAUNCHER__']
+ else:
+ executable = sys.executable
+ dirname, exename = os.path.split(os.path.abspath(executable))
+ context.executable = executable
+ context.python_dir = dirname
+ context.python_exe = exename
+ if sys.platform == 'win32':
+ binname = 'Scripts'
+ incpath = 'Include'
+ libpath = os.path.join(env_dir, 'Lib', 'site-packages')
+ else:
+ binname = 'bin'
+ incpath = 'include'
+ libpath = os.path.join(env_dir, 'lib', 'python%d.%d' % sys.version_info[:2], 'site-packages')
+ context.inc_path = path = os.path.join(env_dir, incpath)
+ create_if_needed(path)
+ create_if_needed(libpath)
+ context.bin_path = binpath = os.path.join(env_dir, binname)
+ context.bin_name = binname
+ context.env_exe = os.path.join(binpath, exename)
+ create_if_needed(binpath)
+ return context
+
+ def create_configuration(self, context):
+ """
+ Create a configuration file indicating where the environment's Python
+ was copied from, and whether the system site-packages should be made
+ available in the environment.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ context.cfg_path = path = os.path.join(context.env_dir, 'pyvenv.cfg')
+ with open(path, 'w', encoding='utf-8') as f:
+ f.write('home = %s\n' % context.python_dir)
+ if self.system_site_packages:
+ incl = 'true'
+ else:
+ incl = 'false'
+ f.write('include-system-site-packages = %s\n' % incl)
+ f.write('version = %d.%d.%d\n' % sys.version_info[:3])
+
+ if os.name == 'nt':
+ def include_binary(self, f):
+ if f.endswith(('.pyd', '.dll')):
+ result = True
+ else:
+ result = f.startswith('python') and f.endswith('.exe')
+ return result
+
+ def symlink_or_copy(self, src, dst):
+ """
+ Try symlinking a file, and if that fails, fall back to copying.
+ """
+ force_copy = not self.symlinks
+ if not force_copy:
+ try:
+ if not os.path.islink(dst): # can't link to itself!
+ os.symlink(src, dst)
+ except Exception: # may need to use a more specific exception
+ logger.warning('Unable to symlink %r to %r', src, dst)
+ force_copy = True
+ if force_copy:
+ shutil.copyfile(src, dst)
+
+ def setup_python(self, context):
+ """
+ Set up a Python executable in the environment.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ binpath = context.bin_path
+ exename = context.python_exe
+ path = context.env_exe
+ copier = self.symlink_or_copy
+ copier(context.executable, path)
+ dirname = context.python_dir
+ if os.name != 'nt':
+ if not os.path.islink(path):
+ os.chmod(path, 0o755)
+ path = os.path.join(binpath, 'python')
+ if not os.path.exists(path):
+ os.symlink(exename, path)
+ else:
+ subdir = 'DLLs'
+ include = self.include_binary
+ files = [f for f in os.listdir(dirname) if include(f)]
+ for f in files:
+ src = os.path.join(dirname, f)
+ dst = os.path.join(binpath, f)
+ if dst != context.env_exe: # already done, above
+ copier(src, dst)
+ dirname = os.path.join(dirname, subdir)
+ if os.path.isdir(dirname):
+ files = [f for f in os.listdir(dirname) if include(f)]
+ for f in files:
+ src = os.path.join(dirname, f)
+ dst = os.path.join(binpath, f)
+ copier(src, dst)
+ # copy init.tcl over
+ for root, dirs, files in os.walk(context.python_dir):
+ if 'init.tcl' in files:
+ tcldir = os.path.basename(root)
+ tcldir = os.path.join(context.env_dir, 'Lib', tcldir)
+ os.makedirs(tcldir)
+ src = os.path.join(root, 'init.tcl')
+ dst = os.path.join(tcldir, 'init.tcl')
+ shutil.copyfile(src, dst)
+ break
+
+ def setup_scripts(self, context):
+ """
+ Set up scripts into the created environment from a directory.
+
+ This method installs the default scripts into the environment
+ being created. You can prevent the default installation by overriding
+ this method if you really need to, or if you need to specify
+ a different location for the scripts to install. By default, the
+ 'scripts' directory in the venv package is used as the source of
+ scripts to install.
+ """
+ path = os.path.abspath(os.path.dirname(__file__))
+ path = os.path.join(path, 'scripts')
+ self.install_scripts(context, path)
+
+ def post_setup(self, context):
+ """
+ Hook for post-setup modification of the venv. Subclasses may install
+ additional packages or scripts here, add activation shell scripts, etc.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ pass
+
+ def replace_variables(self, text, context):
+ """
+ Replace variable placeholders in script text with context-specific
+ variables.
+
+ Return the text passed in , but with variables replaced.
+
+ :param text: The text in which to replace placeholder variables.
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ text = text.replace('__VENV_DIR__', context.env_dir)
+ text = text.replace('__VENV_NAME__', context.prompt)
+ text = text.replace('__VENV_BIN_NAME__', context.bin_name)
+ text = text.replace('__VENV_PYTHON__', context.env_exe)
+ return text
+
+ def install_scripts(self, context, path):
+ """
+ Install scripts into the created environment from a directory.
+
+ :param context: The information for the environment creation request
+ being processed.
+ :param path: Absolute pathname of a directory containing script.
+ Scripts in the 'common' subdirectory of this directory,
+ and those in the directory named for the platform
+ being run on, are installed in the created environment.
+ Placeholder variables are replaced with environment-
+ specific values.
+ """
+ binpath = context.bin_path
+ plen = len(path)
+ for root, dirs, files in os.walk(path):
+ if root == path: # at top-level, remove irrelevant dirs
+ for d in dirs[:]:
+ if d not in ('common', os.name):
+ dirs.remove(d)
+ continue # ignore files in top level
+ for f in files:
+ srcfile = os.path.join(root, f)
+ suffix = root[plen:].split(os.sep)[2:]
+ if not suffix:
+ dstdir = binpath
+ else:
+ dstdir = os.path.join(binpath, *suffix)
+ if not os.path.exists(dstdir):
+ os.makedirs(dstdir)
+ dstfile = os.path.join(dstdir, f)
+ with open(srcfile, 'rb') as f:
+ data = f.read()
+ if srcfile.endswith('.exe'):
+ mode = 'wb'
+ else:
+ mode = 'w'
+ data = data.decode('utf-8')
+ data = self.replace_variables(data, context)
+ with open(dstfile, mode) as f:
+ f.write(data)
+ os.chmod(dstfile, 0o755)
+
+
+# This class will not be included in Python core; it's here for now to
+# facilitate experimentation and testing, and as proof-of-concept of what could
+# be done by external extension tools.
+class DistributeEnvBuilder(EnvBuilder):
+ """
+ By default, this builder installs Distribute so that you can pip or
+ easy_install other packages into the created environment.
+
+ :param nodist: If True, Distribute is not installed into the created
+ environment.
+ :param progress: If Distribute is 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 Distribute.
+
+ 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.progress = kwargs.pop("progress", None)
+ super().__init__(*args, **kwargs)
+
+ def post_setup(self, context):
+ """
+ Set up any packages which need to be pre-installed into the
+ environment being created.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ if not self.nodist:
+ self.install_distribute(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:
+ sys.stderr.write('.')
+ #sys.stderr.write(s.decode('utf-8'))
+ sys.stderr.flush()
+ stream.close()
+
+ def install_distribute(self, context):
+ """
+ Install Distribute in the environment.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ from subprocess import Popen, PIPE
+ from threading import Thread
+ from urllib.request import urlretrieve
+
+ url = 'http://python-distribute.org/distribute_setup.py'
+ binpath = context.bin_path
+ distpath = os.path.join(binpath, 'distribute_setup.py')
+ # Download Distribute in the env
+ urlretrieve(url, distpath)
+ progress = self.progress
+ if progress is not None:
+ progress('Installing distribute', 'main')
+ else:
+ sys.stderr.write('Installing distribute ')
+ sys.stderr.flush()
+ # Install Distribute in the env
+ args = [context.env_exe, 'distribute_setup.py']
+ 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 create(env_dir, system_site_packages=False, clear=False, symlinks=False):
+ """
+ Create a virtual environment in a directory.
+
+ By default, makes the system (global) site-packages dir available to
+ the created environment.
+
+ :param env_dir: The target directory to create an environment in.
+ :param system_site_packages: If True, the system (global) site-packages
+ dir is available to the environment.
+ :param clear: If True and the target directory exists, it is deleted.
+ Otherwise, if the target directory exists, an error is
+ raised.
+ :param symlinks: If True, attempt to symlink rather than copy files into
+ virtual environment.
+ """
+ # XXX This should be changed to EnvBuilder.
+ builder = DistributeEnvBuilder(system_site_packages=system_site_packages,
+ clear=clear, symlinks=symlinks)
+ builder.create(env_dir)
+
+def main(args=None):
+ compatible = True
+ if sys.version_info < (3, 3):
+ compatible = False
+ elif not hasattr(sys, 'base_prefix'):
+ compatible = False
+ if not compatible:
+ raise ValueError('This script is only for use with '
+ 'Python 3.3 (pythonv variant)')
+ else:
+ import argparse
+
+ parser = argparse.ArgumentParser(prog=__name__,
+ description='Creates virtual Python '
+ 'environments in one or '
+ 'more target '
+ 'directories.')
+ parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
+ help='A directory to create the environment in.')
+ # XXX This option will be removed.
+ parser.add_argument('--no-distribute', default=False,
+ action='store_true', dest='nodist',
+ help="Don't install Distribute 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' or (sys.platform == 'darwin' and
+ 'Library/Framework' in sys.base_prefix):
+ use_symlinks = False
+ else:
+ use_symlinks = True
+ parser.add_argument('--symlinks', default=use_symlinks,
+ action='store_true', dest='symlinks',
+ help="Attempt to symlink rather than copy.")
+ parser.add_argument('--clear', default=False, action='store_true',
+ dest='clear', help='Delete the environment '
+ 'directory if it already '
+ 'exists. If not specified and '
+ 'the directory exists, an error'
+ ' is raised.')
+ parser.add_argument('--upgrade', default=False, action='store_true',
+ dest='upgrade', help='Upgrade the environment '
+ 'directory to use this version '
+ 'of Python, assuming it has been '
+ 'upgraded in-place.')
+ options = parser.parse_args(args)
+ if options.upgrade and options.clear:
+ raise ValueError('you cannot supply --upgrade and --clear together.')
+ # XXX This will be changed to EnvBuilder
+ builder = DistributeEnvBuilder(system_site_packages=options.system_site,
+ clear=options.clear,
+ symlinks=options.symlinks,
+ upgrade=options.upgrade,
+ nodist=options.nodist)
+ 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)
diff --git a/Lib/venv/__main__.py b/Lib/venv/__main__.py
new file mode 100644
index 0000000..912423e
--- /dev/null
+++ b/Lib/venv/__main__.py
@@ -0,0 +1,10 @@
+import sys
+from . import main
+
+rc = 1
+try:
+ main()
+ rc = 0
+except Exception as e:
+ print('Error: %s' % e, file=sys.stderr)
+sys.exit(rc)
diff --git a/Lib/venv/scripts/nt/Activate.ps1 b/Lib/venv/scripts/nt/Activate.ps1
new file mode 100644
index 0000000..967ba5c
--- /dev/null
+++ b/Lib/venv/scripts/nt/Activate.ps1
@@ -0,0 +1,34 @@
+$env:VIRTUAL_ENV="__VENV_DIR__"
+
+# Revert to original values
+if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
+ copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
+ remove-item function:_OLD_VIRTUAL_PROMPT
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
+ copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
+ remove-item env:_OLD_VIRTUAL_PYTHONHOME
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PATH) {
+ copy-item env:_OLD_VIRTUAL_PATH env:PATH
+ remove-item env:_OLD_VIRTUAL_PATH
+}
+
+# Set the prompt to include the env name
+copy-item function:prompt function:_OLD_VIRTUAL_PROMPT
+function prompt {
+ Write-Host -NoNewline -ForegroundColor Green [__VENV_NAME__]
+ _OLD_VIRTUAL_PROMPT
+}
+
+# Clear PYTHONHOME
+if (Test-Path env:PYTHONHOME) {
+ copy-item env:PYTHONHOME env:_OLD_VIRTUAL_PYTHONHOME
+ remove-item env:PYTHONHOME
+}
+
+# Add the venv to the PATH
+copy-item env:PATH env:_OLD_VIRTUAL_PATH
+$env:PATH = "$env:VIRTUAL_ENV\__VENV_BIN_NAME__;$env:PATH"
diff --git a/Lib/venv/scripts/nt/Deactivate.ps1 b/Lib/venv/scripts/nt/Deactivate.ps1
new file mode 100644
index 0000000..3d1e96b
--- /dev/null
+++ b/Lib/venv/scripts/nt/Deactivate.ps1
@@ -0,0 +1,19 @@
+# Revert to original values
+if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
+ copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
+ remove-item function:_OLD_VIRTUAL_PROMPT
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
+ copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
+ remove-item env:_OLD_VIRTUAL_PYTHONHOME
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PATH) {
+ copy-item env:_OLD_VIRTUAL_PATH env:PATH
+ remove-item env:_OLD_VIRTUAL_PATH
+}
+
+if (Test-Path env:VIRTUAL_ENV) {
+ remove-item env:VIRTUAL_ENV
+}
diff --git a/Lib/venv/scripts/nt/activate.bat b/Lib/venv/scripts/nt/activate.bat
new file mode 100644
index 0000000..c45e65a
--- /dev/null
+++ b/Lib/venv/scripts/nt/activate.bat
@@ -0,0 +1,31 @@
+@echo off
+set VIRTUAL_ENV=__VENV_DIR__
+
+if not defined PROMPT (
+ set PROMPT=$P$G
+)
+
+if defined _OLD_VIRTUAL_PROMPT (
+ set PROMPT=%_OLD_VIRTUAL_PROMPT%
+)
+
+if defined _OLD_VIRTUAL_PYTHONHOME (
+ set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
+)
+
+set _OLD_VIRTUAL_PROMPT=%PROMPT%
+set PROMPT=__VENV_NAME__%PROMPT%
+
+if defined PYTHONHOME (
+ set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
+ set PYTHONHOME=
+)
+
+if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%; goto SKIPPATH
+
+set _OLD_VIRTUAL_PATH=%PATH%
+
+:SKIPPATH
+set PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%
+
+:END
diff --git a/Lib/venv/scripts/nt/deactivate.bat b/Lib/venv/scripts/nt/deactivate.bat
new file mode 100644
index 0000000..62da5b1
--- /dev/null
+++ b/Lib/venv/scripts/nt/deactivate.bat
@@ -0,0 +1,17 @@
+@echo off
+
+if defined _OLD_VIRTUAL_PROMPT (
+ set PROMPT=%_OLD_VIRTUAL_PROMPT%
+)
+set _OLD_VIRTUAL_PROMPT=
+
+if defined _OLD_VIRTUAL_PYTHONHOME (
+ set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
+ set _OLD_VIRTUAL_PYTHONHOME=
+)
+
+if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
+
+set _OLD_VIRTUAL_PATH=
+
+:END
diff --git a/Lib/venv/scripts/nt/pysetup3-script.py b/Lib/venv/scripts/nt/pysetup3-script.py
new file mode 100644
index 0000000..cfc6661
--- /dev/null
+++ b/Lib/venv/scripts/nt/pysetup3-script.py
@@ -0,0 +1,11 @@
+#!__VENV_PYTHON__
+if __name__ == '__main__':
+ rc = 1
+ try:
+ import sys, re, packaging.run
+ sys.argv[0] = re.sub('-script.pyw?$', '', sys.argv[0])
+ rc = packaging.run.main() # None interpreted as 0
+ except Exception:
+ # use syntax which works with either 2.x or 3.x
+ sys.stderr.write('%s\n' % sys.exc_info()[1])
+ sys.exit(rc)
diff --git a/Lib/venv/scripts/nt/pysetup3.exe b/Lib/venv/scripts/nt/pysetup3.exe
new file mode 100644
index 0000000..3f3c09e
--- /dev/null
+++ b/Lib/venv/scripts/nt/pysetup3.exe
Binary files differ
diff --git a/Lib/venv/scripts/posix/activate b/Lib/venv/scripts/posix/activate
new file mode 100644
index 0000000..c241450
--- /dev/null
+++ b/Lib/venv/scripts/posix/activate
@@ -0,0 +1,76 @@
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+ # reset old environment variables
+ if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
+ PATH="$_OLD_VIRTUAL_PATH"
+ export PATH
+ unset _OLD_VIRTUAL_PATH
+ fi
+ if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
+ PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
+ export PYTHONHOME
+ unset _OLD_VIRTUAL_PYTHONHOME
+ fi
+
+ # This should detect bash and zsh, which have a hash command that must
+ # be called to get it to forget past commands. Without forgetting
+ # past commands the $PATH changes we made may not be respected
+ if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+ hash -r
+ fi
+
+ if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
+ PS1="$_OLD_VIRTUAL_PS1"
+ export PS1
+ unset _OLD_VIRTUAL_PS1
+ fi
+
+ unset VIRTUAL_ENV
+ if [ ! "$1" = "nondestructive" ] ; then
+ # Self destruct!
+ unset -f deactivate
+ fi
+}
+
+# unset irrelavent variables
+deactivate nondestructive
+
+VIRTUAL_ENV="__VENV_DIR__"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
+# could use `if (set -u; : $PYTHONHOME) ;` in bash
+if [ -n "$PYTHONHOME" ] ; then
+ _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
+ unset PYTHONHOME
+fi
+
+if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
+ _OLD_VIRTUAL_PS1="$PS1"
+ if [ "x__VENV_NAME__" != x ] ; then
+ PS1="__VENV_NAME__$PS1"
+ else
+ if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
+ # special case for Aspen magic directories
+ # see http://www.zetadev.com/software/aspen/
+ PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
+ else
+ PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
+ fi
+ fi
+ export PS1
+fi
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands. Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+ hash -r
+fi
diff --git a/Lib/venv/scripts/posix/pysetup3 b/Lib/venv/scripts/posix/pysetup3
new file mode 100644
index 0000000..900f50e
--- /dev/null
+++ b/Lib/venv/scripts/posix/pysetup3
@@ -0,0 +1,11 @@
+#!__VENV_PYTHON__
+if __name__ == '__main__':
+ rc = 1
+ try:
+ import sys, re, packaging.run
+ sys.argv[0] = re.sub('-script.pyw?$', '', sys.argv[0])
+ rc = packaging.run.main() # None interpreted as 0
+ except Exception:
+ # use syntax which works with either 2.x or 3.x
+ sys.stderr.write('%s\n' % sys.exc_info()[1])
+ sys.exit(rc)