diff options
Diffstat (limited to 'docs/cookbook.rst')
-rw-r--r-- | docs/cookbook.rst | 442 |
1 files changed, 3 insertions, 439 deletions
diff --git a/docs/cookbook.rst b/docs/cookbook.rst index dabd7328f..3da030c50 100644 --- a/docs/cookbook.rst +++ b/docs/cookbook.rst @@ -1,444 +1,8 @@ +:orphan: + ============ Cookbook ============ -.. _`Requirements Files`: - -Requirements Files -****************** - -"Requirements files" are files containing a list of items to be -installed using :ref:`pip install -r <install_--requirement>` like so: - - :: - - pip install -r requirements.txt - - -Details on the format of the files are here: :ref:`Requirements File Format`. - - -There are 3 common use cases for requirements files: - -1. When installing many things, it's easier to use a requirements file, - than specifying them all on the command line. - -2. Requirements files are often used to hold the result from :ref:`pip freeze` - for the purpose of achieving :ref:`repeatable installations <Repeatability>`. - In this case, your requirement file contains a pinned version of everything - that was installed when `pip freeze` was run. - - :: - - pip freeze > requirements.txt - pip install -r requirements.txt - -3. Requirements files can be 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: - - :: - - pkg1 - pkg2 - pkg3>=1.0,<=2.0 - - -It's important to be clear that pip determines package dependencies using `install_requires metadata -<http://pythonhosted.org/setuptools/setuptools.html#declaring-dependencies>`_, not by discovering `requirements.txt` -files embedded in projects. - -For a good discussion on the conceptual differences between setup.py and -requirements, see `"setup.py vs requirements.txt" (an article by Donald Stufft) -<https://caremad.io/blog/setup-vs-requirement/>`_ - -See also: - -* :ref:`Requirements File Format` -* :ref:`pip freeze` - - -.. _`Fast & Local Installs`: - -Fast & Local Installs -********************* - -Often, you will want a fast install from local archives, without probing PyPI. - -First, :ref:`download the archives <Downloading Archives>` that fulfill your requirements:: - -$ pip install --download <DIR> -r requirements.txt - -Then, install using :ref:`--find-links <--find-links>` and :ref:`--no-index <--no-index>`:: - -$ pip install --no-index --find-links=[file://]<DIR> -r requirements.txt - - -.. _`Building and Installing Wheels`: - -Building and Installing Wheels -****************************** - -"Wheel" is a built, archive format that can greatly speed installation compared -to building and installing from source archives. For more information, see the -`Wheel docs <http://wheel.readthedocs.org>`_ , -`PEP427 <http://www.python.org/dev/peps/pep-0427>`_, and -`PEP425 <http://www.python.org/dev/peps/pep-0425>`_ - -Pip prefers Wheels where they are available, to disable this use the -:ref:`--no-use-wheel <install_--no-use-wheel>` flag for :ref:`pip install`. - -If no satisfactory wheels are found, pip will default to finding source archives. - -.. note:: - - pip currently disallows platform-specific wheels (except for Windows and Mac) - from being downloaded from PyPI. See :ref:`Should you upload wheels to PyPI`. - - -To install directly from a wheel archive: - -:: - - pip install SomePackage-1.0-py2.py3-none-any.whl - - -pip additionally offers :ref:`pip wheel` as a convenience, to build wheels for -your requirements and dependencies. - -:ref:`pip wheel` requires the `wheel package <https://pypi.python.org/pypi/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: - -:: - - 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): - -:: - - pip install --no-index --find-links=/local/wheels -r requirements.txt - - -.. _`Should you upload wheels to PyPI`: - -Should you upload wheels to PyPI? ---------------------------------- - -The wheel format can eliminate a lot of redundant compilation but, alas, -it's not generally advisable to upload your pre-compiled linux-x86-64 -library binding to pypi. Wheel's tags are only designed to express -the most important *Python*-specific compatibility concerns (Python -version, ABI, and architecture) but do not represent other important -binary compatibility factors such as the OS release, patch level, and -the versions of all the shared library dependencies of any extensions -inside the package. - -Rather than representing all possible compatibility information in the -wheel itself, the wheel design suggests distribution-specific build -services (e.g. a separate index for Fedora Linux binary wheels, compiled -by the index maintainer). This is the same solution taken by Linux -distributions which all re-compile their own packages instead of installing -each other's binary packages. - -Some kinds of precompiled C extension modules can make sense on PyPI, even -for Linux. Good examples include things that can be sensibly statically -linked (a cryptographic hash function; an accelerator module that is -not a binding for an external library); the best example of something -that shouldn't be statically linked is a library like openssl that needs -to be constantly kept up-to-date for security. Regardless of whether a -compatible pre-build package is available, many Linux users will prefer -to always compile their own anyway. - -On Windows and Mac, the case for binary wheels on pypi is stronger due to the -systems being much more uniform than Linux and because it's harder for the end -user to compile their own. Windows and Mac wheels uploaded to pypi should be -compatible with the Python distributions downloaded from http://python.org/. If -you already upload other binary formats to pypi, upload wheels as well. Unlike -the older formats, wheels are compatible with virtual environments. - - -.. _`Downloading Archives`: - -Downloading archives -******************** - -pip allows you to *just* download the source archives for your requirements, without installing anything and without regard to what's already installed. - -:: - -$ pip install --download <DIR> -r requirements.txt - -or, for a specific package:: - -$ pip install --download <DIR> SomePackage - - -Unpacking archives -****************** - -pip allows you to *just* unpack archives to a build directory without installing them to site-packages. This can be useful to troubleshoot install errors or to inspect what is being installed. - -:: - -$ pip install --no-install SomePackage - -If you're in a virtualenv, the build dir is ``<virtualenv path>/build``. Otherwise, it's ``<OS temp dir>/pip-build-<username>`` - -Afterwards, to finish the job of installing unpacked archives, run:: - -$ pip install --no-download SomePackage - - - -Non-recursive upgrades -************************ - -``pip install --upgrade`` is currently written to perform a recursive upgrade. - -E.g. supposing: - -* `SomePackage-1.0` requires `AnotherPackage>=1.0` -* `SomePackage-2.0` requires `AnotherPackage>=1.0` and `OneMorePoject==1.0` -* `SomePackage-1.0` and `AnotherPackage-1.0` are currently installed -* `SomePackage-2.0` and `AnotherPackage-2.0` are the latest versions available on PyPI. - -Running ``pip install --upgrade SomePackage`` would upgrade `SomePackage` *and* `AnotherPackage` -despite `AnotherPackage` already being satisifed. - -If you would like to perform a non-recursive upgrade perform these 2 steps:: - - pip install --upgrade --no-deps SomePackage - pip install SomePackage - -The first line will upgrade `SomePackage`, but not dependencies like `AnotherPackage`. The 2nd line will fill in new dependencies like `OneMorePackage`. - - -.. _`Repeatability`: - -Ensuring Repeatability -********************** - -Three things are required to fully guarantee a repeatable installation using requirements files. - -1. The requirements file was generated by ``pip freeze`` or you're sure it only - contains requirements that specify a specific version. -2. The installation is performed using :ref:`--no-deps <install_--no-deps>`. - This guarantees that only what is explicitly listed in the requirements file is - installed. -3. The installation is performed against an index or find-links location that is - guaranteed to *not* allow archives to be changed and updated without a - version increase. Unfortunately, this is *not* true on PyPI. It is possible - for the same pypi distribution to have a different hash over time. Project - authors are allowed to delete a distribution, and then upload a new one with - the same name and version, but a different hash. See `Issue #1175 - <https://github.com/pypa/pip/issues/1175>`_ for plans to add hash - confirmation to pip, or a new "lock file" notion, but for now, know that the `peep - project <https://pypi.python.org/pypi/peep>`_ offers this feature on top of pip - using requirements file comments. - -User Installs -************* - -With Python 2.6 came the `"user scheme" for installation -<http://docs.python.org/install/index.html#alternate-installation-the-user-scheme>`_, 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 <http://docs.python.org/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``. - -To install "SomePackage" into an environment with site.USER_BASE customized to '/myappenv', do the following:: - - export PYTHONUSERBASE=/myappenv - pip install --user SomePackage - - -``pip install --user`` follows four rules: - -#. When globally installed packages are on the python path, and they *conflict* - with the installation requirements, they are ignored, and *not* - uninstalled. -#. When globally installed packages are on the python path, and they *satisfy* - the installation requirements, pip does nothing, and reports that - requirement is satisfied (similar to how global packages can satisfy - requirements when installing packages in a ``--system-site-packages`` - virtualenv). -#. pip will not perform a ``--user`` install in a ``--no-site-packages`` - virtualenv (i.e. the default kind of virtualenv), due to the user site not - being on the python path. The installation would be pointless. -#. In a ``--system-site-packages`` virtualenv, pip will not install a package - that conflicts with a package in the virtualenv site-packages. The --user - installation would lack sys.path precedence and be pointless. - - -To make the rules clearer, here are some examples: - - -From within a ``--no-site-packages`` virtualenv (i.e. the default kind):: - - $ pip install --user SomePackage - 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:: - - $ pip install --user SomePackage==0.4 - Will not install to the user site because it will lack sys.path precedence - - -From within a real python, where ``SomePackage`` is *not* installed globally:: - - $ pip install --user SomePackage - [...] - Successfully installed SomePackage - - -From within a real python, where ``SomePackage`` *is* installed globally, but is *not* the latest version:: - - $ pip install --user SomePackage - [...] - Requirement already satisfied (use --upgrade to upgrade) - - $ pip install --user --upgrade SomePackage - [...] - Successfully installed SomePackage - - -From within a real python, where ``SomePackage`` *is* installed globally, and is the latest version:: - - $ pip install --user SomePackage - [...] - Requirement already satisfied (use --upgrade to upgrade) - - $ pip install --user --upgrade SomePackage - [...] - Requirement already up-to-date: SomePackage - - # force the install - $ pip install --user --ignore-installed SomePackage - [...] - Successfully installed SomePackage - - - -Controlling setup_requires -************************** - -Setuptools offers the ``setup_requires`` -`setup() keyword <http://pythonhosted.org/setuptools/setuptools.html#new-and-changed-setup-keywords>`_ -for specifying dependencies that need to be present in order for the `setup.py` script to run. -Internally, Setuptools uses ``easy_install`` to fulfill these dependencies. - -pip has no way to control how these dependencies are located. -None of the :ref:`Package Index Options <Package Index Options>` have an effect. - -The solution is to configure a "system" or "personal" -`Distutils configuration file <http://docs.python.org/2/install/index.html#distutils-configuration-files>`_ -to manage the fulfillment. - -For example, to have the dependency located at an alternate index, add this: - -:: - - [easy_install] - index_url = https://my.index-mirror.com - -To have the dependency located from a local directory and not crawl PyPI, add this: - -:: - - [easy_install] - allow_hosts = '' - find_links = file:///path/to/local/archives - - -Upgrading from distribute to setuptools -*************************************** - -`distribute`_ has now been merged into `setuptools`_, and it is recommended to upgrade to setuptools when possible. - -To upgrade from `distribute`_ to `setuptools`_ using pip, run:: - - pip install --upgrade setuptools - -"ImportError: No module named setuptools" ------------------------------------------ - -Although using the upgrade command above works in isolation, it's possible to get -"ImportError: No module named setuptools" when using pip<1.4 to upgrade a -package that depends on setuptools or distribute. - -e.g. when running a command like this: `pip install --upgrade pyramid` - -Solution -~~~~~~~~ - -To prevent the problem in *new* environments (that aren't broken yet): - -* Option 1: - - * *First* run `pip install -U setuptools`, - * *Then* run the command to upgrade your package (e.g. `pip install --upgrade pyramid`) - -* Option 2: - - * Upgrade pip using :ref:`get-pip <get-pip>` - * *Then* run the command to upgrade your package (e.g. `pip install --upgrade pyramid`) - -To fix the problem once it's occurred, you'll need to manually install the new -setuptools, then rerun the upgrade that failed. - -1. Download `ez_setup.py` (https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py) -2. Run `python ez_setup.py` -3. Then rerun your upgrade (e.g. `pip install --upgrade pyramid`) - - -Cause -~~~~~ - -distribute-0.7.3 is just an empty wrapper that only serves to require the new -setuptools (setuptools>=0.7) so that it will be installed. (If you don't know -yet, the "new setuptools" is a merge of distribute and setuptools back into one -project). - -distribute-0.7.3 does its job well, when the upgrade is done in isolation. -E.g. if you're currently on distribute-0.6.X, then running `pip install -U -setuptools` works fine to upgrade you to setuptools>=0.7. - -The problem occurs when: - -1. you are currently using an older distribute (i.e. 0.6.X) -2. and you try to use pip to upgrade a package that *depends* on setuptools or - distribute. - -As part of the upgrade process, pip builds an install list that ends up -including distribute-0.7.3 and setuptools>=0.7 , but they can end up being -separated by other dependencies in the list, so what can happen is this: - -1. pip uninstalls the existing distribute -2. pip installs distribute-0.7.3 (which has no importable setuptools, that pip - *needs* internally to function) -3. pip moves on to install another dependency (before setuptools>=0.7) and is - unable to proceed without the setuptools package - -Note that pip v1.4 has fixes to prevent this. distribute-0.7.3 (or -setuptools>=0.7) by themselves cannot prevent this kind of problem. +This content is now covered in the :doc:`User Guide <user_guide>` -.. _setuptools: https://pypi.python.org/pypi/setuptools -.. _distribute: https://pypi.python.org/pypi/distribute -.. _PyPI: https://pypi.python.org |