blob: d3d5ae2b007d5f2e22ac0f314bcf85d485401665 [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
Elena Oat50326922018-07-28 05:58:05 -070020site 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
Elena Oat50326922018-07-28 05:58:05 -070027.. seealso::
28
29 `Python Packaging User Guide: Creating and using virtual environments
30 <https://packaging.python.org/installing/#creating-virtual-environments>`__
Brett Cannonf8c15052016-10-21 12:53:40 -070031
32
Vinay Sajip7ded1f02012-05-26 03:45:29 +010033Creating virtual environments
34-----------------------------
35
Vinay Sajipc4618e32012-07-10 08:21:07 +010036.. include:: /using/venv-create.inc
Vinay Sajip7ded1f02012-05-26 03:45:29 +010037
Vinay Sajipa945ad12012-07-09 09:24:59 +010038
Vinay Sajipcd9b7462012-07-09 10:37:01 +010039.. _venv-def:
40
Brett Cannon15552c32016-07-08 10:46:21 -070041.. note:: A virtual environment is a Python environment such that the Python
42 interpreter, libraries and scripts installed into it are isolated from those
43 installed in other virtual environments, and (by default) any libraries
44 installed in a "system" Python, i.e., one which is installed as part of your
45 operating system.
Vinay Sajipa945ad12012-07-09 09:24:59 +010046
Brett Cannon15552c32016-07-08 10:46:21 -070047 A virtual environment is a directory tree which contains Python executable
48 files and other files which indicate that it is a virtual environment.
Vinay Sajipa945ad12012-07-09 09:24:59 +010049
Jason R. Coombs13266fb2014-05-12 22:40:49 -040050 Common installation tools such as ``Setuptools`` and ``pip`` work as
Brett Cannon15552c32016-07-08 10:46:21 -070051 expected with virtual environments. In other words, when a virtual
52 environment is active, they install Python packages into the virtual
53 environment without needing to be told to do so explicitly.
Vinay Sajipa945ad12012-07-09 09:24:59 +010054
Brett Cannon15552c32016-07-08 10:46:21 -070055 When a virtual environment is active (i.e., the virtual environment's Python
56 interpreter is running), the attributes :attr:`sys.prefix` and
57 :attr:`sys.exec_prefix` point to the base directory of the virtual
58 environment, whereas :attr:`sys.base_prefix` and
59 :attr:`sys.base_exec_prefix` point to the non-virtual environment Python
60 installation which was used to create the virtual environment. If a virtual
61 environment is not active, then :attr:`sys.prefix` is the same as
62 :attr:`sys.base_prefix` and :attr:`sys.exec_prefix` is the same as
63 :attr:`sys.base_exec_prefix` (they all point to a non-virtual environment
64 Python installation).
Vinay Sajipa945ad12012-07-09 09:24:59 +010065
Brett Cannon15552c32016-07-08 10:46:21 -070066 When a virtual environment is active, any options that change the
67 installation path will be ignored from all distutils configuration files to
68 prevent projects being inadvertently installed outside of the virtual
69 environment.
Georg Brandl521ed522013-05-12 12:36:07 +020070
Brett Cannon15552c32016-07-08 10:46:21 -070071 When working in a command shell, users can make a virtual environment active
72 by running an ``activate`` script in the virtual environment's executables
73 directory (the precise filename is shell-dependent), which prepends the
74 virtual environment's directory for executables to the ``PATH`` environment
75 variable for the running shell. There should be no need in other
76 circumstances to activate a virtual environment—scripts installed into
77 virtual environments have a "shebang" line which points to the virtual
78 environment's Python interpreter. This means that the script will run with
79 that interpreter regardless of the value of ``PATH``. On Windows, "shebang"
80 line processing is supported if you have the Python Launcher for Windows
81 installed (this was added to Python in 3.3 - see :pep:`397` for more
82 details). Thus, double-clicking an installed script in a Windows Explorer
83 window should run the script with the correct interpreter without there
84 needing to be any reference to its virtual environment in ``PATH``.
Vinay Sajipa7045822013-09-06 09:50:43 +010085
Vinay Sajip7ded1f02012-05-26 03:45:29 +010086
Larry Hastings3732ed22014-03-15 21:13:56 -070087.. _venv-api:
88
Vinay Sajip7ded1f02012-05-26 03:45:29 +010089API
90---
91
Vinay Sajip7ded1f02012-05-26 03:45:29 +010092.. highlight:: python
93
Georg Brandldbab58f2012-06-24 16:37:59 +020094The high-level method described above makes use of a simple API which provides
95mechanisms for third-party virtual environment creators to customize environment
96creation according to their needs, the :class:`EnvBuilder` class.
Vinay Sajip7ded1f02012-05-26 03:45:29 +010097
Nick Coghlan8fbdb092013-11-23 00:30:34 +100098.. class:: EnvBuilder(system_site_packages=False, clear=False, \
Vinay Sajipfd0f84b2016-08-06 10:43:44 +010099 symlinks=False, upgrade=False, with_pip=False, \
Cooper Lees4acdbf12019-06-17 11:18:14 -0700100 prompt=None, upgrade_deps=False)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100101
Georg Brandldbab58f2012-06-24 16:37:59 +0200102 The :class:`EnvBuilder` class accepts the following keyword arguments on
103 instantiation:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100104
Georg Brandldbab58f2012-06-24 16:37:59 +0200105 * ``system_site_packages`` -- a Boolean value indicating that the system Python
106 site-packages should be available to the environment (defaults to ``False``).
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100107
Serhiy Storchaka0e90e992013-11-29 12:19:53 +0200108 * ``clear`` -- a Boolean value which, if true, will delete the contents of
Vinay Sajipbd40d3e2012-10-11 17:22:45 +0100109 any existing target directory, before creating the environment.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100110
Georg Brandldbab58f2012-06-24 16:37:59 +0200111 * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the
Steve Dowera1f9a332019-01-30 13:49:14 -0800112 Python binary rather than copying.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100113
Serhiy Storchakafbc1c262013-11-29 12:17:13 +0200114 * ``upgrade`` -- a Boolean value which, if true, will upgrade an existing
Vinay Sajipa945ad12012-07-09 09:24:59 +0100115 environment with the running Python - for use when that Python has been
116 upgraded in-place (defaults to ``False``).
117
Serhiy Storchaka0e90e992013-11-29 12:19:53 +0200118 * ``with_pip`` -- a Boolean value which, if true, ensures pip is
Nick Coghlanaa029da2014-02-09 10:10:24 +1000119 installed in the virtual environment. This uses :mod:`ensurepip` with
120 the ``--default-pip`` option.
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000121
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100122 * ``prompt`` -- a String to be used after virtual environment is activated
123 (defaults to ``None`` which means directory name of the environment would
124 be used).
125
Cooper Lees4acdbf12019-06-17 11:18:14 -0700126 * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI
127
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000128 .. versionchanged:: 3.4
129 Added the ``with_pip`` parameter
130
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100131 .. versionadded:: 3.6
132 Added the ``prompt`` parameter
133
Cooper Lees4acdbf12019-06-17 11:18:14 -0700134 .. versionadded:: 3.8
135 Added the ``upgrade_deps`` parameter
136
Georg Brandldbab58f2012-06-24 16:37:59 +0200137 Creators of third-party virtual environment tools will be free to use the
138 provided ``EnvBuilder`` class as a base class.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100139
Georg Brandldbab58f2012-06-24 16:37:59 +0200140 The returned env-builder is an object which has a method, ``create``:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100141
Georg Brandldbab58f2012-06-24 16:37:59 +0200142 .. method:: create(env_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100143
Georg Brandldbab58f2012-06-24 16:37:59 +0200144 This method takes as required argument the path (absolute or relative to
145 the current directory) of the target directory which is to contain the
146 virtual environment. The ``create`` method will either create the
147 environment in the specified directory, or raise an appropriate
148 exception.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100149
Georg Brandldbab58f2012-06-24 16:37:59 +0200150 The ``create`` method of the ``EnvBuilder`` class illustrates the hooks
151 available for subclass customization::
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100152
Georg Brandldbab58f2012-06-24 16:37:59 +0200153 def create(self, env_dir):
154 """
155 Create a virtualized Python environment in a directory.
156 env_dir is the target directory to create an environment in.
157 """
158 env_dir = os.path.abspath(env_dir)
Georg Brandla0b79232013-10-06 12:52:49 +0200159 context = self.ensure_directories(env_dir)
Georg Brandldbab58f2012-06-24 16:37:59 +0200160 self.create_configuration(context)
161 self.setup_python(context)
162 self.setup_scripts(context)
163 self.post_setup(context)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100164
Georg Brandla0b79232013-10-06 12:52:49 +0200165 Each of the methods :meth:`ensure_directories`,
Georg Brandldbab58f2012-06-24 16:37:59 +0200166 :meth:`create_configuration`, :meth:`setup_python`,
167 :meth:`setup_scripts` and :meth:`post_setup` can be overridden.
168
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100169 .. method:: ensure_directories(env_dir)
Georg Brandldbab58f2012-06-24 16:37:59 +0200170
171 Creates the environment directory and all necessary directories, and
172 returns a context object. This is just a holder for attributes (such as
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100173 paths), for use by the other methods. The directories are allowed to
174 exist already, as long as either ``clear`` or ``upgrade`` were
175 specified to allow operating on an existing environment directory.
Georg Brandldbab58f2012-06-24 16:37:59 +0200176
177 .. method:: create_configuration(context)
178
179 Creates the ``pyvenv.cfg`` configuration file in the environment.
180
181 .. method:: setup_python(context)
182
Steve Dowera1f9a332019-01-30 13:49:14 -0800183 Creates a copy or symlink to the Python executable in the environment.
184 On POSIX systems, if a specific executable ``python3.x`` was used,
185 symlinks to ``python`` and ``python3`` will be created pointing to that
186 executable, unless files with those names already exist.
Georg Brandldbab58f2012-06-24 16:37:59 +0200187
188 .. method:: setup_scripts(context)
189
190 Installs activation scripts appropriate to the platform into the virtual
Steve Dowera1f9a332019-01-30 13:49:14 -0800191 environment.
Georg Brandldbab58f2012-06-24 16:37:59 +0200192
193 .. method:: post_setup(context)
194
195 A placeholder method which can be overridden in third party
196 implementations to pre-install packages in the virtual environment or
197 perform other post-creation steps.
198
Steve Dower1c3de542018-12-10 08:11:21 -0800199 .. versionchanged:: 3.7.2
200 Windows now uses redirector scripts for ``python[w].exe`` instead of
Steve Dowera1f9a332019-01-30 13:49:14 -0800201 copying the actual binaries. In 3.7.2 only :meth:`setup_python` does
202 nothing unless running from a build in the source tree.
203
204 .. versionchanged:: 3.7.3
205 Windows copies the redirector scripts as part of :meth:`setup_python`
206 instead of :meth:`setup_scripts`. This was not the case in 3.7.2.
207 When using symlinks, the original executables will be linked.
Steve Dower1c3de542018-12-10 08:11:21 -0800208
Georg Brandldbab58f2012-06-24 16:37:59 +0200209 In addition, :class:`EnvBuilder` provides this utility method that can be
210 called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to
211 assist in installing custom scripts into the virtual environment.
212
213 .. method:: install_scripts(context, path)
214
215 *path* is the path to a directory that should contain subdirectories
216 "common", "posix", "nt", each containing scripts destined for the bin
217 directory in the environment. The contents of "common" and the
218 directory corresponding to :data:`os.name` are copied after some text
219 replacement of placeholders:
220
221 * ``__VENV_DIR__`` is replaced with the absolute path of the environment
222 directory.
223
224 * ``__VENV_NAME__`` is replaced with the environment name (final path
225 segment of environment directory).
226
Vinay Sajipdff9e252013-10-02 11:36:16 +0100227 * ``__VENV_PROMPT__`` is replaced with the prompt (the environment
228 name surrounded by parentheses and with a following space)
229
Georg Brandldbab58f2012-06-24 16:37:59 +0200230 * ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory
231 (either ``bin`` or ``Scripts``).
232
233 * ``__VENV_PYTHON__`` is replaced with the absolute path of the
234 environment's executable.
235
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100236 The directories are allowed to exist (for when an existing environment
237 is being upgraded).
Georg Brandldbab58f2012-06-24 16:37:59 +0200238
239There is also a module-level convenience function:
240
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000241.. function:: create(env_dir, system_site_packages=False, clear=False, \
Sebastian Koslowski3921b1c2019-05-06 14:51:09 -0400242 symlinks=False, with_pip=False, prompt=None)
Georg Brandldbab58f2012-06-24 16:37:59 +0200243
244 Create an :class:`EnvBuilder` with the given keyword arguments, and call its
245 :meth:`~EnvBuilder.create` method with the *env_dir* argument.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000246
Sebastian Koslowski3921b1c2019-05-06 14:51:09 -0400247 .. versionadded:: 3.3
248
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000249 .. versionchanged:: 3.4
250 Added the ``with_pip`` parameter
251
Sebastian Koslowski3921b1c2019-05-06 14:51:09 -0400252 .. versionchanged:: 3.6
253 Added the ``prompt`` parameter
254
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000255An example of extending ``EnvBuilder``
256--------------------------------------
257
258The following script shows how to extend :class:`EnvBuilder` by implementing a
Brett Cannon15552c32016-07-08 10:46:21 -0700259subclass which installs setuptools and pip into a created virtual environment::
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000260
261 import os
262 import os.path
263 from subprocess import Popen, PIPE
264 import sys
265 from threading import Thread
266 from urllib.parse import urlparse
267 from urllib.request import urlretrieve
268 import venv
269
Vinay Sajip3c557f22013-07-12 20:54:25 +0100270 class ExtendedEnvBuilder(venv.EnvBuilder):
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000271 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100272 This builder installs setuptools and pip so that you can pip or
Brett Cannon15552c32016-07-08 10:46:21 -0700273 easy_install other packages into the created virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000274
Vinay Sajip3c557f22013-07-12 20:54:25 +0100275 :param nodist: If True, setuptools and pip are not installed into the
Brett Cannon15552c32016-07-08 10:46:21 -0700276 created virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000277 :param nopip: If True, pip is not installed into the created
Brett Cannon15552c32016-07-08 10:46:21 -0700278 virtual environment.
Vinay Sajip3c557f22013-07-12 20:54:25 +0100279 :param progress: If setuptools or pip are installed, the progress of the
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000280 installation can be monitored by passing a progress
281 callable. If specified, it is called with two
282 arguments: a string indicating some progress, and a
283 context indicating where the string is coming from.
284 The context argument can have one of three values:
285 'main', indicating that it is called from virtualize()
286 itself, and 'stdout' and 'stderr', which are obtained
287 by reading lines from the output streams of a subprocess
288 which is used to install the app.
289
290 If a callable is not specified, default progress
291 information is output to sys.stderr.
292 """
293
294 def __init__(self, *args, **kwargs):
295 self.nodist = kwargs.pop('nodist', False)
296 self.nopip = kwargs.pop('nopip', False)
297 self.progress = kwargs.pop('progress', None)
298 self.verbose = kwargs.pop('verbose', False)
299 super().__init__(*args, **kwargs)
300
301 def post_setup(self, context):
302 """
303 Set up any packages which need to be pre-installed into the
Brett Cannon15552c32016-07-08 10:46:21 -0700304 virtual environment being created.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000305
Brett Cannon15552c32016-07-08 10:46:21 -0700306 :param context: The information for the virtual environment
307 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000308 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100309 os.environ['VIRTUAL_ENV'] = context.env_dir
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000310 if not self.nodist:
Vinay Sajip3c557f22013-07-12 20:54:25 +0100311 self.install_setuptools(context)
312 # Can't install pip without setuptools
313 if not self.nopip and not self.nodist:
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000314 self.install_pip(context)
315
316 def reader(self, stream, context):
317 """
318 Read lines from a subprocess' output stream and either pass to a progress
319 callable (if specified) or write progress information to sys.stderr.
320 """
321 progress = self.progress
322 while True:
323 s = stream.readline()
324 if not s:
325 break
326 if progress is not None:
327 progress(s, context)
328 else:
329 if not self.verbose:
330 sys.stderr.write('.')
331 else:
332 sys.stderr.write(s.decode('utf-8'))
333 sys.stderr.flush()
Vinay Sajipad6bb032013-07-12 21:44:35 +0100334 stream.close()
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000335
336 def install_script(self, context, name, url):
337 _, _, path, _, _, _ = urlparse(url)
338 fn = os.path.split(path)[-1]
339 binpath = context.bin_path
340 distpath = os.path.join(binpath, fn)
Brett Cannon15552c32016-07-08 10:46:21 -0700341 # Download script into the virtual environment's binaries folder
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000342 urlretrieve(url, distpath)
343 progress = self.progress
Vinay Sajip3c557f22013-07-12 20:54:25 +0100344 if self.verbose:
345 term = '\n'
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000346 else:
Vinay Sajip3c557f22013-07-12 20:54:25 +0100347 term = ''
348 if progress is not None:
349 progress('Installing %s ...%s' % (name, term), 'main')
350 else:
351 sys.stderr.write('Installing %s ...%s' % (name, term))
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000352 sys.stderr.flush()
Brett Cannon15552c32016-07-08 10:46:21 -0700353 # Install in the virtual environment
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000354 args = [context.env_exe, fn]
355 p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
356 t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))
357 t1.start()
358 t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))
359 t2.start()
360 p.wait()
361 t1.join()
362 t2.join()
363 if progress is not None:
364 progress('done.', 'main')
365 else:
366 sys.stderr.write('done.\n')
367 # Clean up - no longer needed
368 os.unlink(distpath)
369
Vinay Sajip3c557f22013-07-12 20:54:25 +0100370 def install_setuptools(self, context):
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000371 """
Brett Cannon15552c32016-07-08 10:46:21 -0700372 Install setuptools in the virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000373
Brett Cannon15552c32016-07-08 10:46:21 -0700374 :param context: The information for the virtual environment
375 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000376 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100377 url = 'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py'
378 self.install_script(context, 'setuptools', url)
379 # clear up the setuptools archive which gets downloaded
380 pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000381 files = filter(pred, os.listdir(context.bin_path))
382 for f in files:
383 f = os.path.join(context.bin_path, f)
384 os.unlink(f)
385
386 def install_pip(self, context):
387 """
Brett Cannon15552c32016-07-08 10:46:21 -0700388 Install pip in the virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000389
Brett Cannon15552c32016-07-08 10:46:21 -0700390 :param context: The information for the virtual environment
391 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000392 """
393 url = 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py'
394 self.install_script(context, 'pip', url)
395
396 def main(args=None):
397 compatible = True
398 if sys.version_info < (3, 3):
399 compatible = False
400 elif not hasattr(sys, 'base_prefix'):
401 compatible = False
402 if not compatible:
403 raise ValueError('This script is only for use with '
404 'Python 3.3 or later')
405 else:
406 import argparse
407
408 parser = argparse.ArgumentParser(prog=__name__,
409 description='Creates virtual Python '
410 'environments in one or '
411 'more target '
412 'directories.')
413 parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
Brett Cannon15552c32016-07-08 10:46:21 -0700414 help='A directory in which to create the
415 'virtual environment.')
Vinay Sajip3c557f22013-07-12 20:54:25 +0100416 parser.add_argument('--no-setuptools', default=False,
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000417 action='store_true', dest='nodist',
Vinay Sajip3c557f22013-07-12 20:54:25 +0100418 help="Don't install setuptools or pip in the "
419 "virtual environment.")
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000420 parser.add_argument('--no-pip', default=False,
421 action='store_true', dest='nopip',
422 help="Don't install pip in the virtual "
423 "environment.")
424 parser.add_argument('--system-site-packages', default=False,
425 action='store_true', dest='system_site',
426 help='Give the virtual environment access to the '
427 'system site-packages dir.')
428 if os.name == 'nt':
429 use_symlinks = False
430 else:
431 use_symlinks = True
432 parser.add_argument('--symlinks', default=use_symlinks,
433 action='store_true', dest='symlinks',
434 help='Try to use symlinks rather than copies, '
435 'when symlinks are not the default for '
436 'the platform.')
437 parser.add_argument('--clear', default=False, action='store_true',
438 dest='clear', help='Delete the contents of the '
Brett Cannon15552c32016-07-08 10:46:21 -0700439 'virtual environment '
440 'directory if it already '
441 'exists, before virtual '
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000442 'environment creation.')
443 parser.add_argument('--upgrade', default=False, action='store_true',
Brett Cannon15552c32016-07-08 10:46:21 -0700444 dest='upgrade', help='Upgrade the virtual '
445 'environment directory to '
446 'use this version of '
447 'Python, assuming Python '
448 'has been upgraded '
449 'in-place.')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000450 parser.add_argument('--verbose', default=False, action='store_true',
451 dest='verbose', help='Display the output '
452 'from the scripts which '
Vinay Sajip3c557f22013-07-12 20:54:25 +0100453 'install setuptools and pip.')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000454 options = parser.parse_args(args)
455 if options.upgrade and options.clear:
456 raise ValueError('you cannot supply --upgrade and --clear together.')
Vinay Sajip3c557f22013-07-12 20:54:25 +0100457 builder = ExtendedEnvBuilder(system_site_packages=options.system_site,
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000458 clear=options.clear,
459 symlinks=options.symlinks,
460 upgrade=options.upgrade,
461 nodist=options.nodist,
462 nopip=options.nopip,
463 verbose=options.verbose)
464 for d in options.dirs:
465 builder.create(d)
466
467 if __name__ == '__main__':
468 rc = 1
469 try:
470 main()
471 rc = 0
472 except Exception as e:
473 print('Error: %s' % e, file=sys.stderr)
474 sys.exit(rc)
475
Vinay Sajip3c557f22013-07-12 20:54:25 +0100476
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000477This script is also available for download `online
Sanyam Khurana338cd832018-01-20 05:55:37 +0530478<https://gist.github.com/vsajip/4673395>`_.