.. _python_packaging:
++++++++++++++++
Python Packaging
++++++++++++++++
Python packaging
================
* `Python Packaging User Guide `_
(`URL on readthedocs.io
`_)
* `pip documentation
`_
* `Python Wheels
`_
* https://hynek.me/articles/conditional-python-dependencies/
.. _py-windows:
Compile Python extensions on Windows
====================================
* Install Windows SDK
* Run "Windows SDK Command Prompt"
* Type::
setenv /x64 /release
set MSSDK=1
set DISTUTILS_USE_SDK=1
See also :ref:`Windows `.
Build a Python Wheel package on Windows
=======================================
For Python 2.7, you need: `Download Visual C++ Compiler for Python 2.7
`_.
Steps:
* `Install pip
`_
* Install wheel using pip::
\python27\python.exe -m pip install wheel
* Run "Windows SDK Command Prompt"
* Setup the environment to build code in 64-bit mode (replace ``/x64`` with
``/x86`` for 32bit)::
setenv /x64 /release
set MSSDK=1
set DISTUTILS_USE_SDK=1
* Go to your project
* Cleanup the project (is it really needed?)::
del build\*
del dist\*
* Build the wheel and upload it::
\python27\python.exe setup.py bdist_wheel upload
Notes:
* To build a 32-bit wheel, you need 32-bit Python and configure the SDK using
``/x86``.
* Python 2.7 requires the Windows SDK v7.0 because Python 2.7 is built using
Visual Studio 2008 (MSVCR90). Python 3.3 is built using Visual Studio 2010.
* It looks like Python 3.3 doesn't need ``MSSDK`` and ``DISTUTILS_USE_SDK``
environment variables anymore.
See also :ref:`Windows `.
Python environment markers
==========================
https://wiki.openstack.org/wiki/Python3#Environment_markers
pip supports environment markers in requirements since pip 6.0, example of
requirement::
six
futures; python_version < '3.2'
pip uses ";" (colon) separator but requires "; " (colon, space) if the
requirement uses an URL. A space is added for readability (spaces are ignored).
Environment markers in extra requirements of setup.cfg::
[extras]
test =
six
futures :python_version < '3.2'
The separator is the ":" (colon), space is only used for readability (spaces
are ignored).
Environment markers in extra requirements of setup.py::
expected_requirements = {
"test:python_version < '3.2'": ['futures'],
"test": ['six']
}
pip issues
==========
* Upgrading pip3 replaces /usr/bin/pip with the Python 3 pip
* Once, I got two dist-info directories for pip
(``ls /usr/lib*/python3.4/site-packages/pip-*.dist-info -d``) which broke
``python3 -m venv``: ``ensurepip`` was unable to find the system pip and
Fedora doesn't include bundled wheel packages of ``ensurepip``
in the ``python3-libs`` package
* With pip 7.0 and newer, ``pip3 install Routes; pip2 install Routes`` installs
the Python 3 version of Routes on Python 2. pip3 creates a wheel package
using 2to3 but Routes 2.1 announces universal wheel support which is wrong.
* Wheel caching doesn't work on pip 7.0, 7.0.1 and 7.0.2. It was fixed in pip
7.0.3.
ensurepip
=========
* Debian doesn't provide ensurepip:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=732703
- Random workaround: https://gist.github.com/uranusjr/d03a49767c7c307be5ed
* Fedora, random links:
- https://github.com/fedora-python/rewheel/issues/2
- https://github.com/fedora-python/rewheel/blob/master/python2-ensurepip-rewheel.patch