Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrap user guide #7079

Merged
merged 1 commit into from
Sep 28, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 78 additions & 67 deletions docs/html/user_guide.rst
Original file line number Diff line number Diff line change
Expand Up @@ -100,15 +100,13 @@ In practice, there are 4 common uses of Requirements files:
2. Requirements files are used to force pip to properly resolve dependencies.
As it is now, pip `doesn't have true dependency resolution
<https://github.com/pypa/pip/issues/988>`_, but instead simply uses the first
specification it finds for a project. E.g. if ``pkg1`` requires ``pkg3>=1.0`` and
``pkg2`` requires ``pkg3>=1.0,<=2.0``, and if ``pkg1`` is resolved first, pip will
only use ``pkg3>=1.0``, and could easily end up installing a version of ``pkg3``
that conflicts with the needs of ``pkg2``. To solve this problem, you can
place ``pkg3>=1.0,<=2.0`` (i.e. the correct specification) into your
requirements file directly along with the other top level requirements. Like
so:

::
specification it finds for a project. E.g. if ``pkg1`` requires
``pkg3>=1.0`` and ``pkg2`` requires ``pkg3>=1.0,<=2.0``, and if ``pkg1`` is
resolved first, pip will only use ``pkg3>=1.0``, and could easily end up
installing a version of ``pkg3`` that conflicts with the needs of ``pkg2``.
To solve this problem, you can place ``pkg3>=1.0,<=2.0`` (i.e. the correct
specification) into your requirements file directly along with the other top
level requirements. Like so::

pkg1
pkg2
Expand All @@ -117,20 +115,18 @@ In practice, there are 4 common uses of Requirements files:
3. Requirements files are used to force pip to install an alternate version of a
sub-dependency. For example, suppose ``ProjectA`` in your requirements file
requires ``ProjectB``, but the latest version (v1.3) has a bug, you can force
pip to accept earlier versions like so:

::
pip to accept earlier versions like so::

ProjectA
ProjectB<1.3

4. Requirements files are used to override a dependency with a local patch that
lives in version control. For example, suppose a dependency,
``SomeDependency`` from PyPI has a bug, and you can't wait for an upstream fix.
lives in version control. For example, suppose a dependency
``SomeDependency`` from PyPI has a bug, and you can't wait for an upstream
fix.
You could clone/copy the src, make the fix, and place it in VCS with the tag
``sometag``. You'd reference it in your requirements file with a line like so:

::
``sometag``. You'd reference it in your requirements file with a line like
so::

git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency

Expand Down Expand Up @@ -198,7 +194,8 @@ to building and installing from source archives. For more information, see the
Pip prefers Wheels where they are available. To disable this, use the
:ref:`--no-binary <install_--no-binary>` flag for :ref:`pip install`.

If no satisfactory wheels are found, pip will default to finding source archives.
If no satisfactory wheels are found, pip will default to finding source
archives.


To install directly from a wheel archive:
Expand All @@ -215,15 +212,16 @@ convenience, to build wheels for all your requirements and dependencies.
<https://pypi.org/project/wheel/>`_ to be installed, which provides the
"bdist_wheel" setuptools extension that it uses.

To build wheels for your requirements and all their dependencies to a local directory:
To build wheels for your requirements and all their dependencies to a local
directory:

::

pip install wheel
pip wheel --wheel-dir=/local/wheels -r requirements.txt


And *then* to install those requirements just using your local directory of wheels (and not from PyPI):
And *then* to install those requirements just using your local directory of
wheels (and not from PyPI):

::

Expand Down Expand Up @@ -447,16 +445,18 @@ is the same as calling::

.. note::

Environment variables set to be empty string will not be treated as false. Please use ``no``,
``false`` or ``0`` instead.
Environment variables set to be empty string will not be treated as false.
Please use ``no``, ``false`` or ``0`` instead.


Config Precedence
-----------------

Command line options have precedence over environment variables, which have precedence over the config file.
Command line options have precedence over environment variables, which have
precedence over the config file.

Within the config file, command specific sections have precedence over the global section.
Within the config file, command specific sections have precedence over the
global section.

Examples:

Expand All @@ -483,8 +483,9 @@ To setup for fish::

$ pip completion --fish > ~/.config/fish/completions/pip.fish

Alternatively, you can use the result of the ``completion`` command
directly with the eval function of your shell, e.g. by adding the following to your startup file::
Alternatively, you can use the result of the ``completion`` command directly
with the eval function of your shell, e.g. by adding the following to your
startup file::

eval "`pip completion --bash`"

Expand Down Expand Up @@ -551,14 +552,16 @@ With Python 2.6 came the `"user scheme" for installation
which means that all Python distributions support an alternative install
location that is specific to a user. The default location for each OS is
explained in the python documentation for the `site.USER_BASE
<https://docs.python.org/3/library/site.html#site.USER_BASE>`_ variable. This mode
of installation can be turned on by specifying the :ref:`--user
<https://docs.python.org/3/library/site.html#site.USER_BASE>`_ variable.
This mode of installation can be turned on by specifying the :ref:`--user
<install_--user>` option to ``pip install``.

Moreover, the "user scheme" can be customized by setting the
``PYTHONUSERBASE`` environment variable, which updates the value of ``site.USER_BASE``.
``PYTHONUSERBASE`` environment variable, which updates the value of
``site.USER_BASE``.

To install "SomePackage" into an environment with site.USER_BASE customized to '/myappenv', do the following::
To install "SomePackage" into an environment with site.USER_BASE customized to
'/myappenv', do the following::

export PYTHONUSERBASE=/myappenv
pip install --user SomePackage
Expand Down Expand Up @@ -591,7 +594,8 @@ From within a ``--no-site-packages`` virtualenv (i.e. the default kind)::
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.


From within a ``--system-site-packages`` virtualenv where ``SomePackage==0.3`` is already installed in the virtualenv::
From within a ``--system-site-packages`` virtualenv where ``SomePackage==0.3``
is already installed in the virtualenv::

$ pip install --user SomePackage==0.4
Will not install to the user site because it will lack sys.path precedence
Expand All @@ -604,7 +608,8 @@ From within a real python, where ``SomePackage`` is *not* installed globally::
Successfully installed SomePackage


From within a real python, where ``SomePackage`` *is* installed globally, but is *not* the latest version::
From within a real python, where ``SomePackage`` *is* installed globally, but
is *not* the latest version::

$ pip install --user SomePackage
[...]
Expand All @@ -615,7 +620,8 @@ From within a real python, where ``SomePackage`` *is* installed globally, but is
Successfully installed SomePackage


From within a real python, where ``SomePackage`` *is* installed globally, and is the latest version::
From within a real python, where ``SomePackage`` *is* installed globally, and
is the latest version::

$ pip install --user SomePackage
[...]
Expand Down Expand Up @@ -679,7 +685,8 @@ requirements file for free). It can also substitute for a vendor library,
providing easier upgrades and less VCS noise. It does not, of course,
provide the availability benefits of a private index or a vendor library.

For more, see :ref:`pip install\'s discussion of hash-checking mode <hash-checking mode>`.
For more, see
:ref:`pip install\'s discussion of hash-checking mode <hash-checking mode>`.

.. _`Installation Bundle`:

Expand Down Expand Up @@ -720,50 +727,54 @@ archives are built with identical packages.
Using pip from your program
***************************

As noted previously, pip is a command line program. While it is implemented in Python,
and so is available from your Python code via ``import pip``, you must not use pip's
internal APIs in this way. There are a number of reasons for this:
As noted previously, pip is a command line program. While it is implemented in
Python, and so is available from your Python code via ``import pip``, you must
not use pip's internal APIs in this way. There are a number of reasons for this:

#. The pip code assumes that is in sole control of the global state of the program.
Pip manages things like the logging system configuration, or the values of the
standard IO streams, without considering the possibility that user code might be
affected.
#. The pip code assumes that is in sole control of the global state of the
program.
pip manages things like the logging system configuration, or the values of
the standard IO streams, without considering the possibility that user code
might be affected.

#. Pip's code is *not* thread safe. If you were to run pip in a thread, there is no
guarantee that either your code or pip's would work as you expect.
#. pip's code is *not* thread safe. If you were to run pip in a thread, there
is no guarantee that either your code or pip's would work as you expect.

#. Pip assumes that once it has finished its work, the process will terminate. It
doesn't need to handle the possibility that other code will continue to run
after that point, so (for example) calling pip twice in the same process is
likely to have issues.
#. pip assumes that once it has finished its work, the process will terminate.
It doesn't need to handle the possibility that other code will continue to
run after that point, so (for example) calling pip twice in the same process
is likely to have issues.

This does not mean that the pip developers are opposed in principle to the idea that
pip could be used as a library - it's just that this isn't how it was written, and it
would be a lot of work to redesign the internals for use as a library, handling all
of the above issues, and designing a usable, robust and stable API that we could
guarantee would remain available across multiple releases of pip. And we simply don't
currently have the resources to even consider such a task.
This does not mean that the pip developers are opposed in principle to the idea
that pip could be used as a library - it's just that this isn't how it was
written, and it would be a lot of work to redesign the internals for use as a
library, handling all of the above issues, and designing a usable, robust and
stable API that we could guarantee would remain available across multiple
releases of pip. And we simply don't currently have the resources to even
consider such a task.

What this means in practice is that everything inside of pip is considered an
implementation detail. Even the fact that the import name is ``pip`` is subject to
change without notice. While we do try not to break things as much as possible, all
the internal APIs can change at any time, for any reason. It also means that we
generally *won't* fix issues that are a result of using pip in an unsupported way.

It should also be noted that installing packages into ``sys.path`` in a running Python
process is something that should only be done with care. The import system caches
certain data, and installing new packages while a program is running may not always
behave as expected. In practice, there is rarely an issue, but it is something to be
aware of.
implementation detail. Even the fact that the import name is ``pip`` is subject
to change without notice. While we do try not to break things as much as
possible, all the internal APIs can change at any time, for any reason. It also
means that we generally *won't* fix issues that are a result of using pip in an
unsupported way.

It should also be noted that installing packages into ``sys.path`` in a running
Python process is something that should only be done with care. The import
system caches certain data, and installing new packages while a program is
running may not always behave as expected. In practice, there is rarely an
issue, but it is something to be aware of.

Having said all of the above, it is worth covering the options available if you
decide that you do want to run pip from within your program. The most reliable
approach, and the one that is fully supported, is to run pip in a subprocess. This
is easily done using the standard ``subprocess`` module::
approach, and the one that is fully supported, is to run pip in a subprocess.
This is easily done using the standard ``subprocess`` module::

subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])

If you want to process the output further, use one of the other APIs in the module::
If you want to process the output further, use one of the other APIs in the
module::

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])

Expand Down