:mod:`ensurepip` --- Bootstrapping the ``pip`` installer
========================================================

.. module:: ensurepip
   :synopsis: Bootstrapping the "pip" installer into an existing Python
              installation or virtual environment.

.. versionadded:: 3.4

--------------

The :mod:`ensurepip` package provides support for bootstrapping the ``pip``
installer into an existing Python installation or virtual environment. This
bootstrapping approach reflects the fact that ``pip`` is an independent
project with its own release cycle, and the latest available stable version
is bundled with maintenance and feature releases of the CPython reference
interpreter.

In most cases, end users of Python shouldn't need to invoke this module
directly (as ``pip`` should be bootstrapped by default), but it may be
needed if installing ``pip`` was skipped when installing Python (or
when creating a virtual environment) or after explicitly uninstalling
``pip``.

.. note::

   This module *does not* access the internet. All of the components
   needed to bootstrap ``pip`` are included as internal parts of the
   package.

.. seealso::

   :ref:`installing-index`
      The end user guide for installing Python packages

   :pep:`453`: Explicit bootstrapping of pip in Python installations
      The original rationale and specification for this module.


Command line interface
----------------------

The command line interface is invoked using the interpreter's ``-m`` switch.

The simplest possible invocation is::

    python -m ensurepip

This invocation will install ``pip`` if it is not already installed,
but otherwise does nothing. To ensure the installed version of ``pip``
is at least as recent as the one bundled with ``ensurepip``, pass the
``--upgrade`` option::

    python -m ensurepip --upgrade

By default, ``pip`` is installed into the current virtual environment
(if one is active) or into the system site packages (if there is no
active virtual environment). The installation location can be controlled
through two additional command line options:

* ``--root <dir>``: Installs ``pip`` relative to the given root directory
  rather than the root of the currently active virtual environment (if any)
  or the default root for the current Python installation.
* ``--user``: Installs ``pip`` into the user site packages directory rather
  than globally for the current Python installation (this option is not
  permitted inside an active virtual environment).

By default, the scripts ``pipX`` and ``pipX.Y`` will be installed (where
X.Y stands for the version of Python used to invoke ``ensurepip``). The
scripts installed can be controlled through two additional command line
options:

* ``--altinstall``: if an alternate installation is requested, the ``pipX``
  script will *not* be installed.

* ``--default-pip``: if a "default pip" installation is requested, the
   ``pip`` script will be installed in addition to the two regular scripts.

Providing both of the script selection options will trigger an exception.


Module API
----------

:mod:`ensurepip` exposes two functions for programmatic use:

.. function:: version()

   Returns a string specifying the bundled version of pip that will be
   installed when bootstrapping an environment.

.. function:: bootstrap(root=None, upgrade=False, user=False, \
                        altinstall=False, default_pip=False, \
                        verbosity=0)

   Bootstraps ``pip`` into the current or designated environment.

   *root* specifies an alternative root directory to install relative to.
   If *root* is ``None``, then installation uses the default install location
   for the current environment.

   *upgrade* indicates whether or not to upgrade an existing installation
   of an earlier version of ``pip`` to the bundled version.

   *user* indicates whether to use the user scheme rather than installing
   globally.

   By default, the scripts ``pipX`` and ``pipX.Y`` will be installed (where
   X.Y stands for the current version of Python).

   If *altinstall* is set, then ``pipX`` will *not* be installed.

   If *default_pip* is set, then ``pip`` will be installed in addition to
   the two regular scripts.

   Setting both *altinstall* and *default_pip* will trigger
   :exc:`ValueError`.

   *verbosity* controls the level of output to :data:`sys.stdout` from the
   bootstrapping operation.

   .. note::

      The bootstrapping process has side effects on both ``sys.path`` and
      ``os.environ``. Invoking the command line interface in a subprocess
      instead allows these side effects to be avoided.

   .. note::

      The bootstrapping process may install additional modules required by
      ``pip``, but other software should not assume those dependencies will
      always be present by default (as the dependencies may be removed in a
      future version of ``pip``).
