blob: 53f3d2640566057125cd0564998a1dd995881354 [file] [log] [blame]
Vinay Sajip7ded1f02012-05-26 03:45:29 +01001:mod:`venv` --- Creation of virtual environments
2================================================
3
4.. module:: venv
5 :synopsis: Creation of virtual environments.
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04006
Vinay Sajip7ded1f02012-05-26 03:45:29 +01007.. moduleauthor:: Vinay Sajip <vinay_sajip@yahoo.co.uk>
8.. sectionauthor:: Vinay Sajip <vinay_sajip@yahoo.co.uk>
9
Vinay Sajip7ded1f02012-05-26 03:45:29 +010010.. versionadded:: 3.3
11
Terry Jan Reedyfa089b92016-06-11 15:02:54 -040012**Source code:** :source:`Lib/venv/`
13
14.. index:: pair: Environments; virtual
Vinay Sajip7ded1f02012-05-26 03:45:29 +010015
16--------------
17
Georg Brandldbab58f2012-06-24 16:37:59 +020018The :mod:`venv` module provides support for creating lightweight "virtual
19environments" with their own site directories, optionally isolated from system
Steve Dower83b449d2018-07-28 17:48:29 +010020site directories. Each virtual environment has its own Python binary (which
21matches the version of the binary that was used to create this environment) and
22can have its own independent set of installed Python packages in its site
23directories.
Georg Brandldbab58f2012-06-24 16:37:59 +020024
Vinay Sajipa7045822013-09-06 09:50:43 +010025See :pep:`405` for more information about Python virtual environments.
Vinay Sajip7ded1f02012-05-26 03:45:29 +010026
Steve Dower83b449d2018-07-28 17:48:29 +010027.. seealso::
28
29 `Python Packaging User Guide: Creating and using virtual environments
30 <https://packaging.python.org/installing/#creating-virtual-environments>`__
31
Brett Cannonf8c15052016-10-21 12:53:40 -070032.. note::
Zachary Warebb444772016-10-25 21:35:22 -050033 The ``pyvenv`` script has been deprecated as of Python 3.6 in favor of using
Brett Cannonf8c15052016-10-21 12:53:40 -070034 ``python3 -m venv`` to help prevent any potential confusion as to which
35 Python interpreter a virtual environment will be based on.
36
37
Vinay Sajip7ded1f02012-05-26 03:45:29 +010038Creating virtual environments
39-----------------------------
40
Vinay Sajipc4618e32012-07-10 08:21:07 +010041.. include:: /using/venv-create.inc
Vinay Sajip7ded1f02012-05-26 03:45:29 +010042
Vinay Sajipa945ad12012-07-09 09:24:59 +010043
Vinay Sajipcd9b7462012-07-09 10:37:01 +010044.. _venv-def:
45
Brett Cannon15552c32016-07-08 10:46:21 -070046.. note:: A virtual environment is a Python environment such that the Python
47 interpreter, libraries and scripts installed into it are isolated from those
48 installed in other virtual environments, and (by default) any libraries
49 installed in a "system" Python, i.e., one which is installed as part of your
50 operating system.
Vinay Sajipa945ad12012-07-09 09:24:59 +010051
Brett Cannon15552c32016-07-08 10:46:21 -070052 A virtual environment is a directory tree which contains Python executable
53 files and other files which indicate that it is a virtual environment.
Vinay Sajipa945ad12012-07-09 09:24:59 +010054
Jason R. Coombs13266fb2014-05-12 22:40:49 -040055 Common installation tools such as ``Setuptools`` and ``pip`` work as
Brett Cannon15552c32016-07-08 10:46:21 -070056 expected with virtual environments. In other words, when a virtual
57 environment is active, they install Python packages into the virtual
58 environment without needing to be told to do so explicitly.
Vinay Sajipa945ad12012-07-09 09:24:59 +010059
Brett Cannon15552c32016-07-08 10:46:21 -070060 When a virtual environment is active (i.e., the virtual environment's Python
61 interpreter is running), the attributes :attr:`sys.prefix` and
62 :attr:`sys.exec_prefix` point to the base directory of the virtual
63 environment, whereas :attr:`sys.base_prefix` and
64 :attr:`sys.base_exec_prefix` point to the non-virtual environment Python
65 installation which was used to create the virtual environment. If a virtual
66 environment is not active, then :attr:`sys.prefix` is the same as
67 :attr:`sys.base_prefix` and :attr:`sys.exec_prefix` is the same as
68 :attr:`sys.base_exec_prefix` (they all point to a non-virtual environment
69 Python installation).
Vinay Sajipa945ad12012-07-09 09:24:59 +010070
Brett Cannon15552c32016-07-08 10:46:21 -070071 When a virtual environment is active, any options that change the
72 installation path will be ignored from all distutils configuration files to
73 prevent projects being inadvertently installed outside of the virtual
74 environment.
Georg Brandl521ed522013-05-12 12:36:07 +020075
Brett Cannon15552c32016-07-08 10:46:21 -070076 When working in a command shell, users can make a virtual environment active
77 by running an ``activate`` script in the virtual environment's executables
78 directory (the precise filename is shell-dependent), which prepends the
79 virtual environment's directory for executables to the ``PATH`` environment
80 variable for the running shell. There should be no need in other
81 circumstances to activate a virtual environment—scripts installed into
82 virtual environments have a "shebang" line which points to the virtual
83 environment's Python interpreter. This means that the script will run with
84 that interpreter regardless of the value of ``PATH``. On Windows, "shebang"
85 line processing is supported if you have the Python Launcher for Windows
86 installed (this was added to Python in 3.3 - see :pep:`397` for more
87 details). Thus, double-clicking an installed script in a Windows Explorer
88 window should run the script with the correct interpreter without there
89 needing to be any reference to its virtual environment in ``PATH``.
Vinay Sajipa7045822013-09-06 09:50:43 +010090
Vinay Sajip7ded1f02012-05-26 03:45:29 +010091
Larry Hastings3732ed22014-03-15 21:13:56 -070092.. _venv-api:
93
Vinay Sajip7ded1f02012-05-26 03:45:29 +010094API
95---
96
Vinay Sajip7ded1f02012-05-26 03:45:29 +010097.. highlight:: python
98
Georg Brandldbab58f2012-06-24 16:37:59 +020099The high-level method described above makes use of a simple API which provides
100mechanisms for third-party virtual environment creators to customize environment
101creation according to their needs, the :class:`EnvBuilder` class.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100102
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000103.. class:: EnvBuilder(system_site_packages=False, clear=False, \
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100104 symlinks=False, upgrade=False, with_pip=False, \
105 prompt=None)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100106
Georg Brandldbab58f2012-06-24 16:37:59 +0200107 The :class:`EnvBuilder` class accepts the following keyword arguments on
108 instantiation:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100109
Georg Brandldbab58f2012-06-24 16:37:59 +0200110 * ``system_site_packages`` -- a Boolean value indicating that the system Python
111 site-packages should be available to the environment (defaults to ``False``).
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100112
Serhiy Storchaka0e90e992013-11-29 12:19:53 +0200113 * ``clear`` -- a Boolean value which, if true, will delete the contents of
Vinay Sajipbd40d3e2012-10-11 17:22:45 +0100114 any existing target directory, before creating the environment.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100115
Georg Brandldbab58f2012-06-24 16:37:59 +0200116 * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the
117 Python binary (and any necessary DLLs or other binaries,
Miss Islington (bot)283e12f2018-06-01 10:57:12 -0700118 e.g. ``pythonw.exe``), rather than copying.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100119
Serhiy Storchakafbc1c262013-11-29 12:17:13 +0200120 * ``upgrade`` -- a Boolean value which, if true, will upgrade an existing
Vinay Sajipa945ad12012-07-09 09:24:59 +0100121 environment with the running Python - for use when that Python has been
122 upgraded in-place (defaults to ``False``).
123
Serhiy Storchaka0e90e992013-11-29 12:19:53 +0200124 * ``with_pip`` -- a Boolean value which, if true, ensures pip is
Nick Coghlanaa029da2014-02-09 10:10:24 +1000125 installed in the virtual environment. This uses :mod:`ensurepip` with
126 the ``--default-pip`` option.
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000127
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100128 * ``prompt`` -- a String to be used after virtual environment is activated
129 (defaults to ``None`` which means directory name of the environment would
130 be used).
131
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000132 .. versionchanged:: 3.4
133 Added the ``with_pip`` parameter
134
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100135 .. versionadded:: 3.6
136 Added the ``prompt`` parameter
137
Georg Brandldbab58f2012-06-24 16:37:59 +0200138 Creators of third-party virtual environment tools will be free to use the
139 provided ``EnvBuilder`` class as a base class.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100140
Georg Brandldbab58f2012-06-24 16:37:59 +0200141 The returned env-builder is an object which has a method, ``create``:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100142
Georg Brandldbab58f2012-06-24 16:37:59 +0200143 .. method:: create(env_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100144
Georg Brandldbab58f2012-06-24 16:37:59 +0200145 This method takes as required argument the path (absolute or relative to
146 the current directory) of the target directory which is to contain the
147 virtual environment. The ``create`` method will either create the
148 environment in the specified directory, or raise an appropriate
149 exception.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100150
Georg Brandldbab58f2012-06-24 16:37:59 +0200151 The ``create`` method of the ``EnvBuilder`` class illustrates the hooks
152 available for subclass customization::
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100153
Georg Brandldbab58f2012-06-24 16:37:59 +0200154 def create(self, env_dir):
155 """
156 Create a virtualized Python environment in a directory.
157 env_dir is the target directory to create an environment in.
158 """
159 env_dir = os.path.abspath(env_dir)
Georg Brandla0b79232013-10-06 12:52:49 +0200160 context = self.ensure_directories(env_dir)
Georg Brandldbab58f2012-06-24 16:37:59 +0200161 self.create_configuration(context)
162 self.setup_python(context)
163 self.setup_scripts(context)
164 self.post_setup(context)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100165
Georg Brandla0b79232013-10-06 12:52:49 +0200166 Each of the methods :meth:`ensure_directories`,
Georg Brandldbab58f2012-06-24 16:37:59 +0200167 :meth:`create_configuration`, :meth:`setup_python`,
168 :meth:`setup_scripts` and :meth:`post_setup` can be overridden.
169
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100170 .. method:: ensure_directories(env_dir)
Georg Brandldbab58f2012-06-24 16:37:59 +0200171
172 Creates the environment directory and all necessary directories, and
173 returns a context object. This is just a holder for attributes (such as
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100174 paths), for use by the other methods. The directories are allowed to
175 exist already, as long as either ``clear`` or ``upgrade`` were
176 specified to allow operating on an existing environment directory.
Georg Brandldbab58f2012-06-24 16:37:59 +0200177
178 .. method:: create_configuration(context)
179
180 Creates the ``pyvenv.cfg`` configuration file in the environment.
181
182 .. method:: setup_python(context)
183
Steve Dowerb264c602018-12-10 08:11:34 -0800184 Creates a copy of the Python executable in the environment on POSIX
185 systems. If a specific executable ``python3.x`` was used, symlinks to
186 ``python`` and ``python3`` will be created pointing to that executable,
187 unless files with those names already exist.
Georg Brandldbab58f2012-06-24 16:37:59 +0200188
189 .. method:: setup_scripts(context)
190
191 Installs activation scripts appropriate to the platform into the virtual
Steve Dowerb264c602018-12-10 08:11:34 -0800192 environment. On Windows, also installs the ``python[w].exe`` scripts.
Georg Brandldbab58f2012-06-24 16:37:59 +0200193
194 .. method:: post_setup(context)
195
196 A placeholder method which can be overridden in third party
197 implementations to pre-install packages in the virtual environment or
198 perform other post-creation steps.
199
Steve Dowerb264c602018-12-10 08:11:34 -0800200 .. versionchanged:: 3.7.2
201 Windows now uses redirector scripts for ``python[w].exe`` instead of
202 copying the actual binaries, and so :meth:`setup_python` does nothing
203 unless running from a build in the source tree.
204
Georg Brandldbab58f2012-06-24 16:37:59 +0200205 In addition, :class:`EnvBuilder` provides this utility method that can be
206 called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to
207 assist in installing custom scripts into the virtual environment.
208
209 .. method:: install_scripts(context, path)
210
211 *path* is the path to a directory that should contain subdirectories
212 "common", "posix", "nt", each containing scripts destined for the bin
213 directory in the environment. The contents of "common" and the
214 directory corresponding to :data:`os.name` are copied after some text
215 replacement of placeholders:
216
217 * ``__VENV_DIR__`` is replaced with the absolute path of the environment
218 directory.
219
220 * ``__VENV_NAME__`` is replaced with the environment name (final path
221 segment of environment directory).
222
Vinay Sajipdff9e252013-10-02 11:36:16 +0100223 * ``__VENV_PROMPT__`` is replaced with the prompt (the environment
224 name surrounded by parentheses and with a following space)
225
Georg Brandldbab58f2012-06-24 16:37:59 +0200226 * ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory
227 (either ``bin`` or ``Scripts``).
228
229 * ``__VENV_PYTHON__`` is replaced with the absolute path of the
230 environment's executable.
231
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100232 The directories are allowed to exist (for when an existing environment
233 is being upgraded).
Georg Brandldbab58f2012-06-24 16:37:59 +0200234
235There is also a module-level convenience function:
236
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000237.. function:: create(env_dir, system_site_packages=False, clear=False, \
238 symlinks=False, with_pip=False)
Georg Brandldbab58f2012-06-24 16:37:59 +0200239
240 Create an :class:`EnvBuilder` with the given keyword arguments, and call its
241 :meth:`~EnvBuilder.create` method with the *env_dir* argument.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000242
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000243 .. versionchanged:: 3.4
244 Added the ``with_pip`` parameter
245
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000246An example of extending ``EnvBuilder``
247--------------------------------------
248
249The following script shows how to extend :class:`EnvBuilder` by implementing a
Brett Cannon15552c32016-07-08 10:46:21 -0700250subclass which installs setuptools and pip into a created virtual environment::
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000251
252 import os
253 import os.path
254 from subprocess import Popen, PIPE
255 import sys
256 from threading import Thread
257 from urllib.parse import urlparse
258 from urllib.request import urlretrieve
259 import venv
260
Vinay Sajip3c557f22013-07-12 20:54:25 +0100261 class ExtendedEnvBuilder(venv.EnvBuilder):
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000262 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100263 This builder installs setuptools and pip so that you can pip or
Brett Cannon15552c32016-07-08 10:46:21 -0700264 easy_install other packages into the created virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000265
Vinay Sajip3c557f22013-07-12 20:54:25 +0100266 :param nodist: If True, setuptools and pip are not installed into the
Brett Cannon15552c32016-07-08 10:46:21 -0700267 created virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000268 :param nopip: If True, pip is not installed into the created
Brett Cannon15552c32016-07-08 10:46:21 -0700269 virtual environment.
Vinay Sajip3c557f22013-07-12 20:54:25 +0100270 :param progress: If setuptools or pip are installed, the progress of the
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000271 installation can be monitored by passing a progress
272 callable. If specified, it is called with two
273 arguments: a string indicating some progress, and a
274 context indicating where the string is coming from.
275 The context argument can have one of three values:
276 'main', indicating that it is called from virtualize()
277 itself, and 'stdout' and 'stderr', which are obtained
278 by reading lines from the output streams of a subprocess
279 which is used to install the app.
280
281 If a callable is not specified, default progress
282 information is output to sys.stderr.
283 """
284
285 def __init__(self, *args, **kwargs):
286 self.nodist = kwargs.pop('nodist', False)
287 self.nopip = kwargs.pop('nopip', False)
288 self.progress = kwargs.pop('progress', None)
289 self.verbose = kwargs.pop('verbose', False)
290 super().__init__(*args, **kwargs)
291
292 def post_setup(self, context):
293 """
294 Set up any packages which need to be pre-installed into the
Brett Cannon15552c32016-07-08 10:46:21 -0700295 virtual environment being created.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000296
Brett Cannon15552c32016-07-08 10:46:21 -0700297 :param context: The information for the virtual environment
298 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000299 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100300 os.environ['VIRTUAL_ENV'] = context.env_dir
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000301 if not self.nodist:
Vinay Sajip3c557f22013-07-12 20:54:25 +0100302 self.install_setuptools(context)
303 # Can't install pip without setuptools
304 if not self.nopip and not self.nodist:
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000305 self.install_pip(context)
306
307 def reader(self, stream, context):
308 """
309 Read lines from a subprocess' output stream and either pass to a progress
310 callable (if specified) or write progress information to sys.stderr.
311 """
312 progress = self.progress
313 while True:
314 s = stream.readline()
315 if not s:
316 break
317 if progress is not None:
318 progress(s, context)
319 else:
320 if not self.verbose:
321 sys.stderr.write('.')
322 else:
323 sys.stderr.write(s.decode('utf-8'))
324 sys.stderr.flush()
Vinay Sajipad6bb032013-07-12 21:44:35 +0100325 stream.close()
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000326
327 def install_script(self, context, name, url):
328 _, _, path, _, _, _ = urlparse(url)
329 fn = os.path.split(path)[-1]
330 binpath = context.bin_path
331 distpath = os.path.join(binpath, fn)
Brett Cannon15552c32016-07-08 10:46:21 -0700332 # Download script into the virtual environment's binaries folder
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000333 urlretrieve(url, distpath)
334 progress = self.progress
Vinay Sajip3c557f22013-07-12 20:54:25 +0100335 if self.verbose:
336 term = '\n'
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000337 else:
Vinay Sajip3c557f22013-07-12 20:54:25 +0100338 term = ''
339 if progress is not None:
340 progress('Installing %s ...%s' % (name, term), 'main')
341 else:
342 sys.stderr.write('Installing %s ...%s' % (name, term))
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000343 sys.stderr.flush()
Brett Cannon15552c32016-07-08 10:46:21 -0700344 # Install in the virtual environment
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000345 args = [context.env_exe, fn]
346 p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
347 t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))
348 t1.start()
349 t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))
350 t2.start()
351 p.wait()
352 t1.join()
353 t2.join()
354 if progress is not None:
355 progress('done.', 'main')
356 else:
357 sys.stderr.write('done.\n')
358 # Clean up - no longer needed
359 os.unlink(distpath)
360
Vinay Sajip3c557f22013-07-12 20:54:25 +0100361 def install_setuptools(self, context):
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000362 """
Brett Cannon15552c32016-07-08 10:46:21 -0700363 Install setuptools in the virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000364
Brett Cannon15552c32016-07-08 10:46:21 -0700365 :param context: The information for the virtual environment
366 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000367 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100368 url = 'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py'
369 self.install_script(context, 'setuptools', url)
370 # clear up the setuptools archive which gets downloaded
371 pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000372 files = filter(pred, os.listdir(context.bin_path))
373 for f in files:
374 f = os.path.join(context.bin_path, f)
375 os.unlink(f)
376
377 def install_pip(self, context):
378 """
Brett Cannon15552c32016-07-08 10:46:21 -0700379 Install pip in the virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000380
Brett Cannon15552c32016-07-08 10:46:21 -0700381 :param context: The information for the virtual environment
382 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000383 """
384 url = 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py'
385 self.install_script(context, 'pip', url)
386
387 def main(args=None):
388 compatible = True
389 if sys.version_info < (3, 3):
390 compatible = False
391 elif not hasattr(sys, 'base_prefix'):
392 compatible = False
393 if not compatible:
394 raise ValueError('This script is only for use with '
395 'Python 3.3 or later')
396 else:
397 import argparse
398
399 parser = argparse.ArgumentParser(prog=__name__,
400 description='Creates virtual Python '
401 'environments in one or '
402 'more target '
403 'directories.')
404 parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
Brett Cannon15552c32016-07-08 10:46:21 -0700405 help='A directory in which to create the
406 'virtual environment.')
Vinay Sajip3c557f22013-07-12 20:54:25 +0100407 parser.add_argument('--no-setuptools', default=False,
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000408 action='store_true', dest='nodist',
Vinay Sajip3c557f22013-07-12 20:54:25 +0100409 help="Don't install setuptools or pip in the "
410 "virtual environment.")
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000411 parser.add_argument('--no-pip', default=False,
412 action='store_true', dest='nopip',
413 help="Don't install pip in the virtual "
414 "environment.")
415 parser.add_argument('--system-site-packages', default=False,
416 action='store_true', dest='system_site',
417 help='Give the virtual environment access to the '
418 'system site-packages dir.')
419 if os.name == 'nt':
420 use_symlinks = False
421 else:
422 use_symlinks = True
423 parser.add_argument('--symlinks', default=use_symlinks,
424 action='store_true', dest='symlinks',
425 help='Try to use symlinks rather than copies, '
426 'when symlinks are not the default for '
427 'the platform.')
428 parser.add_argument('--clear', default=False, action='store_true',
429 dest='clear', help='Delete the contents of the '
Brett Cannon15552c32016-07-08 10:46:21 -0700430 'virtual environment '
431 'directory if it already '
432 'exists, before virtual '
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000433 'environment creation.')
434 parser.add_argument('--upgrade', default=False, action='store_true',
Brett Cannon15552c32016-07-08 10:46:21 -0700435 dest='upgrade', help='Upgrade the virtual '
436 'environment directory to '
437 'use this version of '
438 'Python, assuming Python '
439 'has been upgraded '
440 'in-place.')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000441 parser.add_argument('--verbose', default=False, action='store_true',
442 dest='verbose', help='Display the output '
443 'from the scripts which '
Vinay Sajip3c557f22013-07-12 20:54:25 +0100444 'install setuptools and pip.')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000445 options = parser.parse_args(args)
446 if options.upgrade and options.clear:
447 raise ValueError('you cannot supply --upgrade and --clear together.')
Vinay Sajip3c557f22013-07-12 20:54:25 +0100448 builder = ExtendedEnvBuilder(system_site_packages=options.system_site,
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000449 clear=options.clear,
450 symlinks=options.symlinks,
451 upgrade=options.upgrade,
452 nodist=options.nodist,
453 nopip=options.nopip,
454 verbose=options.verbose)
455 for d in options.dirs:
456 builder.create(d)
457
458 if __name__ == '__main__':
459 rc = 1
460 try:
461 main()
462 rc = 0
463 except Exception as e:
464 print('Error: %s' % e, file=sys.stderr)
465 sys.exit(rc)
466
Vinay Sajip3c557f22013-07-12 20:54:25 +0100467
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000468This script is also available for download `online
Sanyam Khurana338cd832018-01-20 05:55:37 +0530469<https://gist.github.com/vsajip/4673395>`_.