Skip to content

Commit dddbbd9

Browse files
vsajipCAM-Gerlachpelson
authored
[3.10] [doc] Refresh the venv introduction documentation, and correct… (GH-98466)
Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> Co-authored-by: Phil Elson <pelson.pub@gmail.com>
1 parent ac2e7be commit dddbbd9

File tree

2 files changed

+134
-101
lines changed

2 files changed

+134
-101
lines changed

Doc/library/venv.rst

+134-59
Original file line numberDiff line numberDiff line change
@@ -15,74 +15,99 @@
1515

1616
--------------
1717

18-
The :mod:`venv` module provides support for creating lightweight "virtual
19-
environments" with their own site directories, optionally isolated from system
20-
site directories. Each virtual environment has its own Python binary (which
21-
matches the version of the binary that was used to create this environment) and
22-
can have its own independent set of installed Python packages in its site
23-
directories.
18+
.. _venv-def:
19+
.. _venv-intro:
20+
21+
The :mod:`!venv` module supports creating lightweight "virtual environments",
22+
each with their own independent set of Python packages installed in
23+
their :mod:`site` directories.
24+
A virtual environment is created on top of an existing
25+
Python installation, known as the virtual environment's "base" Python, and may
26+
optionally be isolated from the packages in the base environment,
27+
so only those explicitly installed in the virtual environment are available.
28+
29+
When used from within a virtual environment, common installation tools such as
30+
`pip`_ will install Python packages into a virtual environment
31+
without needing to be told to do so explicitly.
2432

25-
See :pep:`405` for more information about Python virtual environments.
33+
See :pep:`405` for more background on Python virtual environments.
2634

2735
.. seealso::
2836

2937
`Python Packaging User Guide: Creating and using virtual environments
3038
<https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment>`__
3139

32-
3340
Creating virtual environments
3441
-----------------------------
3542

3643
.. include:: /using/venv-create.inc
3744

45+
.. _venv-explanation:
3846

39-
.. _venv-def:
47+
How venvs work
48+
--------------
4049

41-
.. 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.
46-
47-
A virtual environment is a directory tree which contains Python executable
48-
files and other files which indicate that it is a virtual environment.
49-
50-
Common installation tools such as setuptools_ and pip_ work as
51-
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.
54-
55-
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).
65-
66-
When a virtual environment is active, any options that change the
67-
installation path will be ignored from all :mod:`distutils` configuration
68-
files to prevent projects being inadvertently installed outside of the
69-
virtual environment.
70-
71-
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 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``.
50+
When a Python interpreter is running from a virtual environment,
51+
:data:`sys.prefix` and :data:`sys.exec_prefix`
52+
point to the directories of the virtual environment,
53+
whereas :data:`sys.base_prefix` and :data:`sys.base_exec_prefix`
54+
point to those of the base Python used to create the environment.
55+
It is sufficient to check
56+
``sys.prefix == sys.base_prefix`` to determine if the current interpreter is
57+
running from a virtual environment.
58+
59+
A virtual environment may be "activated" using a script in its binary directory
60+
(``bin`` on POSIX; ``Scripts`` on Windows).
61+
This will prepend that directory to your :envvar:`!PATH`, so that running
62+
:program:`!python` will invoke the environment's Python interpreter
63+
and you can run installed scripts without having to use their full path.
64+
The invocation of the activation script is platform-specific
65+
(:samp:`{<venv>}` must be replaced by the path to the directory
66+
containing the virtual environment):
67+
68+
+-------------+------------+--------------------------------------------------+
69+
| Platform | Shell | Command to activate virtual environment |
70+
+=============+============+==================================================+
71+
| POSIX | bash/zsh | :samp:`$ source {<venv>}/bin/activate` |
72+
| +------------+--------------------------------------------------+
73+
| | fish | :samp:`$ source {<venv>}/bin/activate.fish` |
74+
| +------------+--------------------------------------------------+
75+
| | csh/tcsh | :samp:`$ source {<venv>}/bin/activate.csh` |
76+
| +------------+--------------------------------------------------+
77+
| | PowerShell | :samp:`$ {<venv>}/bin/Activate.ps1` |
78+
+-------------+------------+--------------------------------------------------+
79+
| Windows | cmd.exe | :samp:`C:\\> {<venv>}\\Scripts\\activate.bat` |
80+
| +------------+--------------------------------------------------+
81+
| | PowerShell | :samp:`PS C:\\> {<venv>}\\Scripts\\Activate.ps1` |
82+
+-------------+------------+--------------------------------------------------+
83+
84+
.. versionadded:: 3.4
85+
:program:`!fish` and :program:`!csh` activation scripts.
86+
87+
.. versionadded:: 3.8
88+
PowerShell activation scripts installed under POSIX for PowerShell Core
89+
support.
90+
91+
You don't specifically *need* to activate a virtual environment,
92+
as you can just specify the full path to that environment's
93+
Python interpreter when invoking Python.
94+
Furthermore, all scripts installed in the environment
95+
should be runnable without activating it.
96+
97+
In order to achieve this, scripts installed into virtual environments have
98+
a "shebang" line which points to the environment's Python interpreter,
99+
i.e. :samp:`#!/{<path-to-venv>}/bin/python`.
100+
This means that the script will run with that interpreter regardless of the
101+
value of :envvar:`!PATH`. On Windows, "shebang" line processing is supported if
102+
you have the :ref:`launcher` installed. Thus, double-clicking an installed
103+
script in a Windows Explorer window should run it with the correct interpreter
104+
without the environment needing to be activated or on the :envvar:`!PATH`.
105+
106+
When a virtual environment has been activated, the :envvar:`!VIRTUAL_ENV`
107+
environment variable is set to the path of the environment.
108+
Since explicitly activating a virtual environment is not required to use it,
109+
:envvar:`!VIRTUAL_ENV` cannot be relied upon to determine
110+
whether a virtual environment is being used.
86111

87112
.. warning:: Because scripts installed in environments should not expect the
88113
environment to be activated, their shebang lines contain the absolute paths
@@ -98,6 +123,11 @@ Creating virtual environments
98123
environment in its new location. Otherwise, software installed into the
99124
environment may not work as expected.
100125

126+
You can deactivate a virtual environment by typing ``deactivate`` in your shell.
127+
The exact mechanism is platform-specific and is an internal implementation
128+
detail (typically, a script or shell function will be used).
129+
130+
101131
.. _venv-api:
102132

103133
API
@@ -183,11 +213,56 @@ creation according to their needs, the :class:`EnvBuilder` class.
183213

184214
.. method:: ensure_directories(env_dir)
185215

186-
Creates the environment directory and all necessary directories, and
187-
returns a context object. This is just a holder for attributes (such as
188-
paths), for use by the other methods. The directories are allowed to
189-
exist already, as long as either ``clear`` or ``upgrade`` were
190-
specified to allow operating on an existing environment directory.
216+
Creates the environment directory and all necessary subdirectories that
217+
don't already exist, and returns a context object. This context object
218+
is just a holder for attributes (such as paths) for use by the other
219+
methods. If the :class:`EnvBuilder` is created with the arg
220+
``clear=True``, contents of the environment directory will be cleared
221+
and then all necessary subdirectories will be recreated.
222+
223+
The returned context object is a :class:`types.SimpleNamespace` with the
224+
following attributes:
225+
226+
* ``env_dir`` - The location of the virtual environment. Used for
227+
``__VENV_DIR__`` in activation scripts (see :meth:`install_scripts`).
228+
229+
* ``env_name`` - The name of the virtual environment. Used for
230+
``__VENV_NAME__`` in activation scripts (see :meth:`install_scripts`).
231+
232+
* ``prompt`` - The prompt to be used by the activation scripts. Used for
233+
``__VENV_PROMPT__`` in activation scripts (see :meth:`install_scripts`).
234+
235+
* ``executable`` - The underlying Python executable used by the virtual
236+
environment. This takes into account the case where a virtual environment
237+
is created from another virtual environment.
238+
239+
* ``inc_path`` - The include path for the virtual environment.
240+
241+
* ``lib_path`` - The purelib path for the virtual environment.
242+
243+
* ``bin_path`` - The script path for the virtual environment.
244+
245+
* ``bin_name`` - The name of the script path relative to the virtual
246+
environment location. Used for ``__VENV_BIN_NAME__`` in activation
247+
scripts (see :meth:`install_scripts`).
248+
249+
* ``env_exe`` - The name of the Python interpreter in the virtual
250+
environment. Used for ``__VENV_PYTHON__`` in activation scripts
251+
(see :meth:`install_scripts`).
252+
253+
* ``env_exec_cmd`` - The name of the Python interpreter, taking into
254+
account filesystem redirections. This can be used to run Python in
255+
the virtual environment.
256+
257+
258+
.. versionchanged:: 3.12
259+
The attribute ``lib_path`` was added to the context, and the context
260+
object was documented.
261+
262+
.. versionchanged:: 3.11
263+
The *venv*
264+
:ref:`sysconfig installation scheme <installation_paths>`
265+
is used to construct the paths of the created directories.
191266

192267
.. method:: create_configuration(context)
193268

Doc/using/venv-create.inc

-42
Original file line numberDiff line numberDiff line change
@@ -105,45 +105,3 @@ Multiple paths can be given to ``venv``, in which case an identical virtual
105105
environment will be created, according to the given options, at each provided
106106
path.
107107
108-
Once a virtual environment has been created, it can be "activated" using a
109-
script in the virtual environment's binary directory. The invocation of the
110-
script is platform-specific (`<venv>` must be replaced by the path of the
111-
directory containing the virtual environment):
112-
113-
+-------------+-----------------+-----------------------------------------+
114-
| Platform | Shell | Command to activate virtual environment |
115-
+=============+=================+=========================================+
116-
| POSIX | bash/zsh | $ source <venv>/bin/activate |
117-
+-------------+-----------------+-----------------------------------------+
118-
| | fish | $ source <venv>/bin/activate.fish |
119-
+-------------+-----------------+-----------------------------------------+
120-
| | csh/tcsh | $ source <venv>/bin/activate.csh |
121-
+-------------+-----------------+-----------------------------------------+
122-
| | PowerShell Core | $ <venv>/bin/Activate.ps1 |
123-
+-------------+-----------------+-----------------------------------------+
124-
| Windows | cmd.exe | C:\\> <venv>\\Scripts\\activate.bat |
125-
+-------------+-----------------+-----------------------------------------+
126-
| | PowerShell | PS C:\\> <venv>\\Scripts\\Activate.ps1 |
127-
+-------------+-----------------+-----------------------------------------+
128-
129-
When a virtual environment is active, the :envvar:`VIRTUAL_ENV` environment
130-
variable is set to the path of the virtual environment. This can be used to
131-
check if one is running inside a virtual environment.
132-
133-
You don't specifically *need* to activate an environment; activation just
134-
prepends the virtual environment's binary directory to your path, so that
135-
"python" invokes the virtual environment's Python interpreter and you can run
136-
installed scripts without having to use their full path. However, all scripts
137-
installed in a virtual environment should be runnable without activating it,
138-
and run with the virtual environment's Python automatically.
139-
140-
You can deactivate a virtual environment by typing "deactivate" in your shell.
141-
The exact mechanism is platform-specific and is an internal implementation
142-
detail (typically a script or shell function will be used).
143-
144-
.. versionadded:: 3.4
145-
``fish`` and ``csh`` activation scripts.
146-
147-
.. versionadded:: 3.8
148-
PowerShell activation scripts installed under POSIX for PowerShell Core
149-
support.

0 commit comments

Comments
 (0)