blob: 5d4a36481f1dcc5b51e78471edb3cf067afb0a9a [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
Ogi Moorec4a65ed2020-02-10 15:51:01 -080030 <https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment>`__
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
Brett Cannon2f224a02019-07-23 14:34:32 -070050 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
Brett Cannon2f224a02019-07-23 14:34:32 -070067 installation path will be ignored from all :mod:`distutils` configuration
68 files to prevent projects being inadvertently installed outside of the
69 virtual 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
Brett Cannon2f224a02019-07-23 14:34:32 -070073 directory (the precise filename and command to use the file is
74 shell-dependent), which prepends the virtual environment's directory for
75 executables to the ``PATH`` environment variable for the running shell. There
76 should be no need in other circumstances to activate a virtual
77 environment; scripts installed into virtual environments have a "shebang"
78 line which points to the virtual environment's Python interpreter. This means
79 that the script will run with that interpreter regardless of the value of
80 ``PATH``. On Windows, "shebang" line processing is supported if you have the
81 Python Launcher for Windows installed (this was added to Python in 3.3 - see
82 :pep:`397` for more details). Thus, double-clicking an installed script in a
83 Windows Explorer window should run the script with the correct interpreter
84 without there needing to be any reference to its virtual environment in
85 ``PATH``.
Vinay Sajipa7045822013-09-06 09:50:43 +010086
Vinay Sajip7ded1f02012-05-26 03:45:29 +010087
Larry Hastings3732ed22014-03-15 21:13:56 -070088.. _venv-api:
89
Vinay Sajip7ded1f02012-05-26 03:45:29 +010090API
91---
92
Vinay Sajip7ded1f02012-05-26 03:45:29 +010093.. highlight:: python
94
Georg Brandldbab58f2012-06-24 16:37:59 +020095The high-level method described above makes use of a simple API which provides
96mechanisms for third-party virtual environment creators to customize environment
97creation according to their needs, the :class:`EnvBuilder` class.
Vinay Sajip7ded1f02012-05-26 03:45:29 +010098
Nick Coghlan8fbdb092013-11-23 00:30:34 +100099.. class:: EnvBuilder(system_site_packages=False, clear=False, \
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100100 symlinks=False, upgrade=False, with_pip=False, \
Cooper Lees4acdbf12019-06-17 11:18:14 -0700101 prompt=None, upgrade_deps=False)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100102
Georg Brandldbab58f2012-06-24 16:37:59 +0200103 The :class:`EnvBuilder` class accepts the following keyword arguments on
104 instantiation:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100105
Georg Brandldbab58f2012-06-24 16:37:59 +0200106 * ``system_site_packages`` -- a Boolean value indicating that the system Python
107 site-packages should be available to the environment (defaults to ``False``).
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100108
Serhiy Storchaka0e90e992013-11-29 12:19:53 +0200109 * ``clear`` -- a Boolean value which, if true, will delete the contents of
Vinay Sajipbd40d3e2012-10-11 17:22:45 +0100110 any existing target directory, before creating the environment.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100111
Georg Brandldbab58f2012-06-24 16:37:59 +0200112 * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the
Steve Dowera1f9a332019-01-30 13:49:14 -0800113 Python binary rather than copying.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100114
Serhiy Storchakafbc1c262013-11-29 12:17:13 +0200115 * ``upgrade`` -- a Boolean value which, if true, will upgrade an existing
Vinay Sajipa945ad12012-07-09 09:24:59 +0100116 environment with the running Python - for use when that Python has been
117 upgraded in-place (defaults to ``False``).
118
Serhiy Storchaka0e90e992013-11-29 12:19:53 +0200119 * ``with_pip`` -- a Boolean value which, if true, ensures pip is
Nick Coghlanaa029da2014-02-09 10:10:24 +1000120 installed in the virtual environment. This uses :mod:`ensurepip` with
121 the ``--default-pip`` option.
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000122
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100123 * ``prompt`` -- a String to be used after virtual environment is activated
124 (defaults to ``None`` which means directory name of the environment would
Vinay Sajip7d637802020-01-14 20:49:30 +0000125 be used). If the special string ``"."`` is provided, the basename of the
126 current directory is used as the prompt.
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100127
Cooper Lees4acdbf12019-06-17 11:18:14 -0700128 * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI
129
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000130 .. versionchanged:: 3.4
131 Added the ``with_pip`` parameter
132
Vinay Sajipfd0f84b2016-08-06 10:43:44 +0100133 .. versionadded:: 3.6
134 Added the ``prompt`` parameter
135
Tzu-ping Chung045d4e22019-11-28 04:21:48 +0800136 .. versionadded:: 3.9
Cooper Lees4acdbf12019-06-17 11:18:14 -0700137 Added the ``upgrade_deps`` parameter
138
Georg Brandldbab58f2012-06-24 16:37:59 +0200139 Creators of third-party virtual environment tools will be free to use the
Brett Cannon2f224a02019-07-23 14:34:32 -0700140 provided :class:`EnvBuilder` class as a base class.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100141
Georg Brandldbab58f2012-06-24 16:37:59 +0200142 The returned env-builder is an object which has a method, ``create``:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100143
Georg Brandldbab58f2012-06-24 16:37:59 +0200144 .. method:: create(env_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100145
Brett Cannon2f224a02019-07-23 14:34:32 -0700146 Create a virtual environment by specifying the target directory
147 (absolute or relative to the current directory) which is to contain the
Georg Brandldbab58f2012-06-24 16:37:59 +0200148 virtual environment. The ``create`` method will either create the
149 environment in the specified directory, or raise an appropriate
150 exception.
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100151
Brett Cannon2f224a02019-07-23 14:34:32 -0700152 The ``create`` method of the :class:`EnvBuilder` class illustrates the
153 hooks available for subclass customization::
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100154
Georg Brandldbab58f2012-06-24 16:37:59 +0200155 def create(self, env_dir):
156 """
157 Create a virtualized Python environment in a directory.
158 env_dir is the target directory to create an environment in.
159 """
160 env_dir = os.path.abspath(env_dir)
Georg Brandla0b79232013-10-06 12:52:49 +0200161 context = self.ensure_directories(env_dir)
Georg Brandldbab58f2012-06-24 16:37:59 +0200162 self.create_configuration(context)
163 self.setup_python(context)
164 self.setup_scripts(context)
165 self.post_setup(context)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100166
Georg Brandla0b79232013-10-06 12:52:49 +0200167 Each of the methods :meth:`ensure_directories`,
Georg Brandldbab58f2012-06-24 16:37:59 +0200168 :meth:`create_configuration`, :meth:`setup_python`,
169 :meth:`setup_scripts` and :meth:`post_setup` can be overridden.
170
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100171 .. method:: ensure_directories(env_dir)
Georg Brandldbab58f2012-06-24 16:37:59 +0200172
173 Creates the environment directory and all necessary directories, and
174 returns a context object. This is just a holder for attributes (such as
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100175 paths), for use by the other methods. The directories are allowed to
176 exist already, as long as either ``clear`` or ``upgrade`` were
177 specified to allow operating on an existing environment directory.
Georg Brandldbab58f2012-06-24 16:37:59 +0200178
179 .. method:: create_configuration(context)
180
181 Creates the ``pyvenv.cfg`` configuration file in the environment.
182
183 .. method:: setup_python(context)
184
Steve Dowera1f9a332019-01-30 13:49:14 -0800185 Creates a copy or symlink to the Python executable in the environment.
186 On POSIX systems, if a specific executable ``python3.x`` was used,
187 symlinks to ``python`` and ``python3`` will be created pointing to that
188 executable, unless files with those names already exist.
Georg Brandldbab58f2012-06-24 16:37:59 +0200189
190 .. method:: setup_scripts(context)
191
192 Installs activation scripts appropriate to the platform into the virtual
Steve Dowera1f9a332019-01-30 13:49:14 -0800193 environment.
Georg Brandldbab58f2012-06-24 16:37:59 +0200194
Vinay Sajip264e0342019-09-09 14:50:38 +0100195 .. method:: upgrade_dependencies(context)
196
197 Upgrades the core venv dependency packages (currently ``pip`` and
198 ``setuptools``) in the environment. This is done by shelling out to the
199 ``pip`` executable in the environment.
200
Tzu-ping Chung045d4e22019-11-28 04:21:48 +0800201 .. versionadded:: 3.9
Vinay Sajip264e0342019-09-09 14:50:38 +0100202
Georg Brandldbab58f2012-06-24 16:37:59 +0200203 .. method:: post_setup(context)
204
205 A placeholder method which can be overridden in third party
206 implementations to pre-install packages in the virtual environment or
207 perform other post-creation steps.
208
Steve Dower1c3de542018-12-10 08:11:21 -0800209 .. versionchanged:: 3.7.2
210 Windows now uses redirector scripts for ``python[w].exe`` instead of
Steve Dowera1f9a332019-01-30 13:49:14 -0800211 copying the actual binaries. In 3.7.2 only :meth:`setup_python` does
212 nothing unless running from a build in the source tree.
213
214 .. versionchanged:: 3.7.3
215 Windows copies the redirector scripts as part of :meth:`setup_python`
216 instead of :meth:`setup_scripts`. This was not the case in 3.7.2.
217 When using symlinks, the original executables will be linked.
Steve Dower1c3de542018-12-10 08:11:21 -0800218
Georg Brandldbab58f2012-06-24 16:37:59 +0200219 In addition, :class:`EnvBuilder` provides this utility method that can be
220 called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to
221 assist in installing custom scripts into the virtual environment.
222
223 .. method:: install_scripts(context, path)
224
225 *path* is the path to a directory that should contain subdirectories
226 "common", "posix", "nt", each containing scripts destined for the bin
227 directory in the environment. The contents of "common" and the
228 directory corresponding to :data:`os.name` are copied after some text
229 replacement of placeholders:
230
231 * ``__VENV_DIR__`` is replaced with the absolute path of the environment
232 directory.
233
234 * ``__VENV_NAME__`` is replaced with the environment name (final path
235 segment of environment directory).
236
Vinay Sajipdff9e252013-10-02 11:36:16 +0100237 * ``__VENV_PROMPT__`` is replaced with the prompt (the environment
238 name surrounded by parentheses and with a following space)
239
Georg Brandldbab58f2012-06-24 16:37:59 +0200240 * ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory
241 (either ``bin`` or ``Scripts``).
242
243 * ``__VENV_PYTHON__`` is replaced with the absolute path of the
244 environment's executable.
245
Vinay Sajip577d4ff2013-07-12 21:52:51 +0100246 The directories are allowed to exist (for when an existing environment
247 is being upgraded).
Georg Brandldbab58f2012-06-24 16:37:59 +0200248
249There is also a module-level convenience function:
250
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000251.. function:: create(env_dir, system_site_packages=False, clear=False, \
Shantanu1cba1c92020-05-23 02:58:50 -0700252 symlinks=False, with_pip=False, prompt=None, \
253 upgrade_deps=False)
Georg Brandldbab58f2012-06-24 16:37:59 +0200254
255 Create an :class:`EnvBuilder` with the given keyword arguments, and call its
256 :meth:`~EnvBuilder.create` method with the *env_dir* argument.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000257
Sebastian Koslowski3921b1c2019-05-06 14:51:09 -0400258 .. versionadded:: 3.3
259
Nick Coghlan8fbdb092013-11-23 00:30:34 +1000260 .. versionchanged:: 3.4
261 Added the ``with_pip`` parameter
262
Sebastian Koslowski3921b1c2019-05-06 14:51:09 -0400263 .. versionchanged:: 3.6
264 Added the ``prompt`` parameter
265
Shantanu1cba1c92020-05-23 02:58:50 -0700266 .. versionchanged:: 3.9
267 Added the ``upgrade_deps`` parameter
268
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000269An example of extending ``EnvBuilder``
270--------------------------------------
271
272The following script shows how to extend :class:`EnvBuilder` by implementing a
Brett Cannon15552c32016-07-08 10:46:21 -0700273subclass which installs setuptools and pip into a created virtual environment::
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000274
275 import os
276 import os.path
277 from subprocess import Popen, PIPE
278 import sys
279 from threading import Thread
280 from urllib.parse import urlparse
281 from urllib.request import urlretrieve
282 import venv
283
Vinay Sajip3c557f22013-07-12 20:54:25 +0100284 class ExtendedEnvBuilder(venv.EnvBuilder):
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000285 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100286 This builder installs setuptools and pip so that you can pip or
Brett Cannon15552c32016-07-08 10:46:21 -0700287 easy_install other packages into the created virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000288
Serhiy Storchaka138ccbb2019-11-12 16:57:03 +0200289 :param nodist: If true, setuptools and pip are not installed into the
Brett Cannon15552c32016-07-08 10:46:21 -0700290 created virtual environment.
Serhiy Storchaka138ccbb2019-11-12 16:57:03 +0200291 :param nopip: If true, pip is not installed into the created
Brett Cannon15552c32016-07-08 10:46:21 -0700292 virtual environment.
Vinay Sajip3c557f22013-07-12 20:54:25 +0100293 :param progress: If setuptools or pip are installed, the progress of the
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000294 installation can be monitored by passing a progress
295 callable. If specified, it is called with two
296 arguments: a string indicating some progress, and a
297 context indicating where the string is coming from.
298 The context argument can have one of three values:
299 'main', indicating that it is called from virtualize()
300 itself, and 'stdout' and 'stderr', which are obtained
301 by reading lines from the output streams of a subprocess
302 which is used to install the app.
303
304 If a callable is not specified, default progress
305 information is output to sys.stderr.
306 """
307
308 def __init__(self, *args, **kwargs):
309 self.nodist = kwargs.pop('nodist', False)
310 self.nopip = kwargs.pop('nopip', False)
311 self.progress = kwargs.pop('progress', None)
312 self.verbose = kwargs.pop('verbose', False)
313 super().__init__(*args, **kwargs)
314
315 def post_setup(self, context):
316 """
317 Set up any packages which need to be pre-installed into the
Brett Cannon15552c32016-07-08 10:46:21 -0700318 virtual environment being created.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000319
Brett Cannon15552c32016-07-08 10:46:21 -0700320 :param context: The information for the virtual environment
321 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000322 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100323 os.environ['VIRTUAL_ENV'] = context.env_dir
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000324 if not self.nodist:
Vinay Sajip3c557f22013-07-12 20:54:25 +0100325 self.install_setuptools(context)
326 # Can't install pip without setuptools
327 if not self.nopip and not self.nodist:
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000328 self.install_pip(context)
329
330 def reader(self, stream, context):
331 """
332 Read lines from a subprocess' output stream and either pass to a progress
333 callable (if specified) or write progress information to sys.stderr.
334 """
335 progress = self.progress
336 while True:
337 s = stream.readline()
338 if not s:
339 break
340 if progress is not None:
341 progress(s, context)
342 else:
343 if not self.verbose:
344 sys.stderr.write('.')
345 else:
346 sys.stderr.write(s.decode('utf-8'))
347 sys.stderr.flush()
Vinay Sajipad6bb032013-07-12 21:44:35 +0100348 stream.close()
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000349
350 def install_script(self, context, name, url):
351 _, _, path, _, _, _ = urlparse(url)
352 fn = os.path.split(path)[-1]
353 binpath = context.bin_path
354 distpath = os.path.join(binpath, fn)
Brett Cannon15552c32016-07-08 10:46:21 -0700355 # Download script into the virtual environment's binaries folder
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000356 urlretrieve(url, distpath)
357 progress = self.progress
Vinay Sajip3c557f22013-07-12 20:54:25 +0100358 if self.verbose:
359 term = '\n'
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000360 else:
Vinay Sajip3c557f22013-07-12 20:54:25 +0100361 term = ''
362 if progress is not None:
363 progress('Installing %s ...%s' % (name, term), 'main')
364 else:
365 sys.stderr.write('Installing %s ...%s' % (name, term))
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000366 sys.stderr.flush()
Brett Cannon15552c32016-07-08 10:46:21 -0700367 # Install in the virtual environment
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000368 args = [context.env_exe, fn]
369 p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
370 t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))
371 t1.start()
372 t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))
373 t2.start()
374 p.wait()
375 t1.join()
376 t2.join()
377 if progress is not None:
378 progress('done.', 'main')
379 else:
380 sys.stderr.write('done.\n')
381 # Clean up - no longer needed
382 os.unlink(distpath)
383
Vinay Sajip3c557f22013-07-12 20:54:25 +0100384 def install_setuptools(self, context):
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000385 """
Brett Cannon15552c32016-07-08 10:46:21 -0700386 Install setuptools in the virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000387
Brett Cannon15552c32016-07-08 10:46:21 -0700388 :param context: The information for the virtual environment
389 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000390 """
Vinay Sajip3c557f22013-07-12 20:54:25 +0100391 url = 'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py'
392 self.install_script(context, 'setuptools', url)
393 # clear up the setuptools archive which gets downloaded
394 pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000395 files = filter(pred, os.listdir(context.bin_path))
396 for f in files:
397 f = os.path.join(context.bin_path, f)
398 os.unlink(f)
399
400 def install_pip(self, context):
401 """
Brett Cannon15552c32016-07-08 10:46:21 -0700402 Install pip in the virtual environment.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000403
Brett Cannon15552c32016-07-08 10:46:21 -0700404 :param context: The information for the virtual environment
405 creation request being processed.
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000406 """
407 url = 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py'
408 self.install_script(context, 'pip', url)
409
410 def main(args=None):
411 compatible = True
412 if sys.version_info < (3, 3):
413 compatible = False
414 elif not hasattr(sys, 'base_prefix'):
415 compatible = False
416 if not compatible:
417 raise ValueError('This script is only for use with '
418 'Python 3.3 or later')
419 else:
420 import argparse
421
422 parser = argparse.ArgumentParser(prog=__name__,
423 description='Creates virtual Python '
424 'environments in one or '
425 'more target '
426 'directories.')
427 parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
Brett Cannon15552c32016-07-08 10:46:21 -0700428 help='A directory in which to create the
429 'virtual environment.')
Vinay Sajip3c557f22013-07-12 20:54:25 +0100430 parser.add_argument('--no-setuptools', default=False,
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000431 action='store_true', dest='nodist',
Vinay Sajip3c557f22013-07-12 20:54:25 +0100432 help="Don't install setuptools or pip in the "
433 "virtual environment.")
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000434 parser.add_argument('--no-pip', default=False,
435 action='store_true', dest='nopip',
436 help="Don't install pip in the virtual "
437 "environment.")
438 parser.add_argument('--system-site-packages', default=False,
439 action='store_true', dest='system_site',
440 help='Give the virtual environment access to the '
441 'system site-packages dir.')
442 if os.name == 'nt':
443 use_symlinks = False
444 else:
445 use_symlinks = True
446 parser.add_argument('--symlinks', default=use_symlinks,
447 action='store_true', dest='symlinks',
448 help='Try to use symlinks rather than copies, '
449 'when symlinks are not the default for '
450 'the platform.')
451 parser.add_argument('--clear', default=False, action='store_true',
452 dest='clear', help='Delete the contents of the '
Brett Cannon15552c32016-07-08 10:46:21 -0700453 'virtual environment '
454 'directory if it already '
455 'exists, before virtual '
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000456 'environment creation.')
457 parser.add_argument('--upgrade', default=False, action='store_true',
Brett Cannon15552c32016-07-08 10:46:21 -0700458 dest='upgrade', help='Upgrade the virtual '
459 'environment directory to '
460 'use this version of '
461 'Python, assuming Python '
462 'has been upgraded '
463 'in-place.')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000464 parser.add_argument('--verbose', default=False, action='store_true',
465 dest='verbose', help='Display the output '
466 'from the scripts which '
Vinay Sajip3c557f22013-07-12 20:54:25 +0100467 'install setuptools and pip.')
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000468 options = parser.parse_args(args)
469 if options.upgrade and options.clear:
470 raise ValueError('you cannot supply --upgrade and --clear together.')
Vinay Sajip3c557f22013-07-12 20:54:25 +0100471 builder = ExtendedEnvBuilder(system_site_packages=options.system_site,
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000472 clear=options.clear,
473 symlinks=options.symlinks,
474 upgrade=options.upgrade,
475 nodist=options.nodist,
476 nopip=options.nopip,
477 verbose=options.verbose)
478 for d in options.dirs:
479 builder.create(d)
480
481 if __name__ == '__main__':
482 rc = 1
483 try:
484 main()
485 rc = 0
486 except Exception as e:
487 print('Error: %s' % e, file=sys.stderr)
488 sys.exit(rc)
489
Vinay Sajip3c557f22013-07-12 20:54:25 +0100490
Vinay Sajip2b4fcfb2013-01-30 13:44:00 +0000491This script is also available for download `online
Sanyam Khurana338cd832018-01-20 05:55:37 +0530492<https://gist.github.com/vsajip/4673395>`_.
Brett Cannon2f224a02019-07-23 14:34:32 -0700493
494
495.. _setuptools: https://pypi.org/project/setuptools/
496.. _pip: https://pypi.org/project/pip/