[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: New, updated pip coming



I am confused. Here's my understanding of things...

 - Pip doesn't need wheels at all - its vendoring technique doesn't use wheels.
 - Virtualenv needs to install pip, wheel, setuptools when it makes a
new environment, and it does that by some oogly code
 - venv might do the same thing, but I haven't check its actual implementation
 - the pip-whl package was used to give virtualenv a thing to use to
install pip when making a virtualenv

If that aligns with your understanding, I'll put it down to the prose
you wrote rather than us actually having a different worldview; OTOH
if it doesn't, I'd like to find out where I'm wrong, so as to improve
my understanding.

With my understanding in mind - Can I just check something?

 If a new requests package is built, uploaded to the archive and
apt-get installed on my machine, and I then do:
virtualenv test
. test/bin/activate
pip install foobar
 ^--- what version of requests will be used by this in-virtualenv
invocation of pip?

>From your description I expect it to be the version of requests that
was dpkg installed at the time the pip deb was built?

-Rob


On 30 January 2016 at 08:28, Barry Warsaw <barry@debian.org> wrote:
> TL;DR By the end of today, I expect to upload pip 8.0.2 to unstable, finally
> bringing us up to the latest version.
>
> It's been a long slog, with many people helping out.  I hope that all the hard
> work done to get us here means it will be much, much easier to track new pip,
> virtualenv, and pyvenv updates going forward.  And now, details!
>
> pip requires the use of PEP 427 wheels, which are essentially zip files of
> importable, pure-Python, bilingual code, with a little bit of metadata.  Put a
> wheel on sys.path and Python can import from it.  pip and friends use wheels
> because it ensures that they can't break themselves when their dependent
> packages are updated.  E.g. if pip depends on requests, and you `pip install
> --upgrade requests` it's possible the new version would be incompatible with
> pip.  Then you'd have a broken pip on your hands.  Remember that you can use
> pip to install pre-release packages too.
>
> So by putting the wheels on sys.path *before* anything else, even if you pip
> install an incompatible requests, it won't break pip itself.
>
> pip "vendorizes" (i.e. bundles) the wheels of its dependencies with known good
> versions, but this breaks Debian policy, so we have to unbundle these.
> Several upstreams use this technique, with requests and urllib3 as probably
> the most popular examples.  In all these cases, we have to remove the bundled
> wheels and hope that the versions of their dependencies in Debian remain
> compatible.  It's a chore, but that's our job as distro developers, and it's
> the best option given the conflicting requirements.
>
> Fortunately, we can create our own wheels and use them with pip and friends.
> Until now, we had to build the wheels at the time that the dependent packages
> where built, and we had to have a corresponding foo-whl binary package in the
> archives, because we could only use setup.py's bdist_wheel command (which
> comes with python{,3}-wheel) to create these.  With 15 run time dependencies
> as of pip 7.1.2, this has become untenable, and was a huge reason why Debian's
> pip has lagged so far behind upstream.  (That, and a few ITPs for new
> dependencies. ;)
>
> Along comes dirtbike.  https://github.com/paulproteus/dirtbike
>
> While it has been much discussed and attempted over the years, it would be
> really nice to have a tool that turned installed Python packages into wheels.
> I think we discussed such a tool for Debian at last year's (two years ago?)
> Debian BOF at Pycon.  Anyway, Asheesh Laroia finally took hold of the, ahem,
> wheel, and wrote the initial implementation, which he called dirtbike.  Since
> then I've been enhancing it to work with several oddball cases in the Debian
> archive, and now it's good enough to turn pip's dependencies into wheels.
>
> Yesterday I uploaded the last of the new pip dependencies (modulo any
> surprises in 8.0.2 ;), and dirtbike so now all the pieces are in place.  What
> pip now does during its own build process, is turn its installed dependencies
> into .whl files and puts them in the policy defined location.  This allows us
> to eliminate all those scattered -whl binary packages, and just
> Build-Depend/Built-Using in pip to install the standard Python packages,
> rewheel them, and put them in a python-pip-whl package.  Going forward, this
> will make life so much easier, because only python-pip needs to know anything
> about wheels, even if new dependencies are added.
>
> I have everything working locally.  I need to update the master branch for
> pip, which involves many curse words hurled at git-dpm (and that's a post for
> another day!).  I also have to update my local branch to 8.0.2, but I'm
> assuming there won't be any new surprises there.
>
> Eventually, I'll be using the same techique for virtualenv and pyvenv, but not
> right away.
>
> Huge thanks also go to Donald Stufft, who always is so helpful with various
> technical details, and works really hard to understand our needs and balance
> them with upstream's.
>
> Finally, we need to update Python policy to describe the new wheel policy.
> Fortunately, this is much better because it removes constraints on other
> packages, and reduces the number of -whl binary packages in the distro.  Yes,
> I will update those packages that already ship -whls, or file bugs, but only
> once I'm sure everything is working correctly.
>
> Below is the policy diff, which I'll commit to the python-defaults bzr.
>
> As always, once everything's uploaded, please do let me know via this list or
> BTS, if you notice any problems with pip.
>
> Cheers,
> -Barry
>
> === modified file 'debian/python-policy.sgml'
> --- debian/python-policy.sgml   2016-01-24 06:01:19 +0000
> +++ debian/python-policy.sgml   2016-01-29 16:49:59 +0000
> @@ -458,13 +458,12 @@
>          <p>
>            <url id="http://legacy.python.org/dev/peps/pep-0427/";
>                 name="PEP 427">
> -          defines a built-package format called "wheels", which is a zip
> -          format archive containing Python code and a "dist-info" metadata
> +          defines a built-package format called "wheels", a zip
> +          archive containing Python code and a "dist-info" metadata
>            directory, in a single file named with the .whl suffix.  As zip
>            files, wheels containing pure-Python can be put on sys.path and
>            modules in the wheel can be imported directly by Python's "import"
> -          statement. (Importing extension modules from wheels is not yet
> -          supported as of Python 3.4.)
> +          statement.
>          </p><p>
>            Except as described below, packages must not build or provide
>            wheels.  They are redundant to the established way of providing
> @@ -475,18 +474,20 @@
>          </p><p>
>            A very limited set of wheel packages are available in the archive,
>            but these support the narrow purpose of enabling
> -          the <prgn>pip</prgn> tool, in a Debian policy compliant way.  The
> -          set of packages providing wheels for this purpose are (by source
> -          package name): chardet, distlib, html5lib, python-colorama,
> -          python-pip, python-setuptools, python-urllib3, requests, and six.
> +          the <prgn>pip</prgn>, <prgn>virtualenv</prgn>,
> +          and <prgn>pyvenv</prgn> tools in a Debian policy compliant way.
> +          These packages build their own dependent wheels through the use of
> +          the <prgn>dirtbike</prgn> "rewheeling" tool, which takes installed
> +          Debian packages and turns them back into wheels.  Only universal
> +          wheels (i.e. pure-Python, Python 2 and 3 compatible packages) are
> +          supported.  Since only the programs that require wheels need build
> +          them, only they may provide <var>-whl</var> packages,
> +          e.g. <package>python-pip-whl</package>.
>          </p><p>
> -          Wheel packages supporting <prgn>pyvenv</prgn> and <prgn>pip</prgn>
> -          are named with the <var>python-</var> prefix, and the <var>-whl</var>
> -          suffix, e.g. <package>python-chardet-whl</package>.  When these
> -          binary packages are installed, their .whl files must be placed in
> -          the /usr/share/python-wheels directory.  Such wheels must be built
> -          with the <tt>--universal</tt> flag so as to generate wheels
> -          compatible with both Python 2 and Python 3.
> +          When these binary packages are installed, .whl files must be placed
> +          in the /usr/share/python-wheels directory.  The location inside a
> +          virtual environment will be rooted in the virtual environment,
> +          instead of in /usr.
>          </p>
>        </sect>
>        <sect id="package_names">
>



-- 
Robert Collins <rbtcollins@hpe.com>
Distinguished Technologist
HP Converged Cloud


Reply to: