[Python-modules-commits] [python-pip] 03/16: We need to add all the recursively devendorized dependent wheels to sys.path so that they can be imported. These wheel files live in different places depending on whether we're inside or outside a virtual environment.

Barry Warsaw barry at moszumanska.debian.org
Fri Jan 29 22:23:21 UTC 2016


This is an automated email from the git hooks/post-receive script.

barry pushed a commit to branch master
in repository python-pip.

commit 8daa7d7a7e376b6dc27cfd7189ba7a90e080cd56
Author: Barry Warsaw <barry at debian.org>
Date:   Tue May 26 15:53:34 2015 -0400

    We need to add all the recursively devendorized dependent wheels to
    sys.path so that they can be imported.  These wheel files live in
    different places depending on whether we're inside or outside a virtual
    environment.
    
    Forwarded: not-needed
    Patch-Name: use-wheels.patch
---
 pip/__init__.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 setup.py        |  8 +++++++-
 2 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/pip/__init__.py b/pip/__init__.py
index 0603ca1..00f19d2 100755
--- a/pip/__init__.py
+++ b/pip/__init__.py
@@ -8,6 +8,69 @@ import warnings
 
 import sys
 import re
+import errno
+
+# Upstream pip vendorizes a bunch of its dependencies.  Debian de-vendorizes
+# (unbundles) these dependencies to be compliant with Debian policy.  Instead,
+# these dependencies are packaged as wheel (.whl) files in a known location.
+# When pip itself executes, we have to arrange for these wheels to show up
+# earlier on sys.path than any  other version of these packages, otherwise
+# things can break.  See for example Bug #744145.
+#
+# The location of the wheels differs depending on whether we're inside or
+# outside a virtual environment, regardless of whether that venv was created
+# with virtualenv or pyvenv.  The first thing we have to do is figure out if
+# we're inside or outside a venv, then search the appropriate wheel directory
+# and add all the .whls found there to the front of sys.path.  As per Debian
+# Python Policy, only the wheels needed to support this de-vendorization will
+# be present, so it's safe to add them all.
+#
+# venv determination is a bit of a black art, but this algorithm should work
+# in both Python 2 (virtualenv-only) and Python 3 (pyvenv and virtualenv).  -
+# updated by barry at debian.org 2015-02-25
+
+base_prefix = getattr(sys, 'base_prefix', None)
+real_prefix = getattr(sys, 'real_prefix', None)
+if base_prefix is None:
+    # Python 2 has no base_prefix at all.  It also has no pyvenv.  Fall back
+    # to checking real_prefix.
+    if real_prefix is None:
+        # We are not in a venv.
+        in_venv = False
+    else:
+        # We're in a Python 2 virtualenv created venv, but real_prefix should
+        # never be the same as sys.prefix.
+        assert sys.prefix != real_prefix
+        in_venv = True
+elif sys.prefix != base_prefix:
+    # We're in a Python 3, pyvenv created venv.
+    in_venv = True
+elif real_prefix is None:
+    # We're in Python 3, outside a venv, but base better equal prefix.
+    assert sys.prefix == base_prefix
+    in_venv = False
+else:
+    # We're in a Python 3, virtualenv created venv.
+    assert real_prefix != sys.prefix
+    in_venv = True
+
+
+if in_venv:
+    wheel_dir = os.path.join(sys.prefix, 'lib', 'python-wheels')
+else:
+    wheel_dir = '/usr/share/python-wheels'
+
+# We'll add all the wheels we find to the front of sys.path so that they're
+# found first, even if the same dependencies are available in site-packages.
+try:
+    for filename in os.listdir(wheel_dir):
+        if os.path.splitext(filename)[1] == '.whl':
+            sys.path.insert(0, os.path.join(wheel_dir, filename))
+# FileNotFoundError doesn't exist in Python 2, but ignore it anyway.
+except OSError as error:
+    if error.errno != errno.ENOENT:
+        raise
+
 
 from pip.exceptions import InstallationError, CommandError, PipError
 from pip.utils import get_installed_distributions, get_prog
diff --git a/setup.py b/setup.py
index 43bab40..75fa69e 100644
--- a/setup.py
+++ b/setup.py
@@ -41,7 +41,13 @@ def find_version(*file_paths):
 
 long_description = read('README.rst')
 
-tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock']
+tests_require = ['pytest', 'scripttest>=1.3', 'mock']
+
+# In Debian, the virtualenv Build-Depends will satisfy this requirement
+# but setup() is too dumb to notice that.
+if sys.version_info < (3,):
+    tests_require.append('virtualenv>=1.10')
+
 
 
 setup(

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-pip.git



More information about the Python-modules-commits mailing list