# Buggy code
def main():
    pip_version = StrictVersion(
        check_output(["pip", "--version"]).decode("utf-8").split()[1]
    )
    min_pip_version = StrictVersion(PIP_VERSION)
    if pip_version >= min_pip_version:
        return 0
    has_pip_cache = pip_version >= StrictVersion("6.0")
    index_base = get_index_base()
    temp = mkdtemp(prefix="pipstrap-")
    try:
        downloads = [
            hashed_download(index_base + "/packages/" + path, temp, digest)
            for path, digest in PACKAGES
        ]
        check_output(
            "pip install --no-index --no-deps -U "
            +
            # Disable cache since we're not using it and it otherwise
            # sometimes throws permission warnings:
            ("--no-cache-dir " if has_pip_cache else "")
            + " ".join(quote(d) for d in downloads),
            shell=True,
        )
    except HashError as exc:
        print(exc)
    except Exception:
        rmtree(temp)
        raise
    else:
        rmtree(temp)
        return 0
    return 1


# Traceback (Exception)
$ /opt/eff.org/certbot/certbot-auto --no-bootstrap --install-only
Creating virtual environment...
Installing Python packages...
Had a problem while installing Python packages.

pip prints the following errors:
=====================================================
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting argparse==1.4.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 11))
Downloading https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl
Collecting pycparser==2.14 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 17))
Downloading https://files.pythonhosted.org/packages/6d/31/666614af3db0acf377876d48688c5d334b6e493b96d21aa7d332169bee50/pycparser-2.14.tar.gz (223kB)
Collecting asn1crypto==0.22.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 21))
Downloading https://files.pythonhosted.org/packages/97/ba/7e8117d8efcee589f4d96dd2b2eb1d997f96d27d214cf2b7134ad8acf6ab/asn1crypto-0.22.0-py2.py3-none-any.whl (97kB)
Collecting cffi==1.11.5 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 24))
Downloading https://files.pythonhosted.org/packages/14/dd/3e7a1e1280e7d767bd3fa15791759c91ec19058ebe31217fe66f3e9a8c49/cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl (407kB)
Collecting ConfigArgParse==0.12.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 57))
Downloading https://files.pythonhosted.org/packages/17/8d/4a41f11b0971017c7001f118be8003da8f7b96b010c66cd792b76658d1e1/ConfigArgParse-0.12.0.tar.gz (41kB)
Collecting configobj==5.0.6 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 60))
Downloading https://files.pythonhosted.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz
Collecting cryptography==2.2.2 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 63))
Downloading https://files.pythonhosted.org/packages/dd/c2/3a5bfefb25690725824ade71e6b65449f0a9f4b29702cce10560f786ebf6/cryptography-2.2.2-cp27-cp27mu-manylinux1_x86_64.whl (2.2MB)
Collecting enum34==1.1.2 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 83))
Downloading https://files.pythonhosted.org/packages/6f/e9/08fd439384b7e3d613e75a6c8236b8e64d90c47d23413493b38d4229a9a5/enum34-1.1.2.tar.gz (46kB)
Collecting funcsigs==1.0.2 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 86))
Downloading https://files.pythonhosted.org/packages/69/cb/f5be453359271714c01b9bd06126eaf2e368f1fddfff30818754b5ac2328/funcsigs-1.0.2-py2.py3-none-any.whl
Collecting idna==2.5 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 89))
Downloading https://files.pythonhosted.org/packages/11/7d/9bbbd7bb35f34b0169542487d2a8859e44306bb2e6a4455d491800a5621f/idna-2.5-py2.py3-none-any.whl (55kB)
Collecting ipaddress==1.0.16 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 92))
Downloading https://files.pythonhosted.org/packages/23/6a/813ac29a01e4c33c19c2bded98ac3d4266ebbf0bd2c0eb0020e1c969958d/ipaddress-1.0.16-py27-none-any.whl
Collecting josepy==1.1.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 95))
Downloading https://files.pythonhosted.org/packages/23/46/30ac29742b03be92e05d1fd9048df6f0902bb0b3b042a7ea76a2b3c30f7e/josepy-1.1.0-py2.py3-none-any.whl (53kB)
Collecting linecache2==1.0.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 98))
Downloading https://files.pythonhosted.org/packages/c7/a3/c5da2a44c85bfbb6eebcfc1dde24933f8704441b98fdde6528f4831757a6/linecache2-1.0.0-py2.py3-none-any.whl
Collecting mock==1.3.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 102))
Downloading https://files.pythonhosted.org/packages/b2/50/664a70b87408bb6c14c1af2337efa64eb8d1af80c933531758b8fb41ec25/mock-1.3.0-py2.py3-none-any.whl (56kB)
Collecting ordereddict==1.1 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 105))
Downloading https://files.pythonhosted.org/packages/53/25/ef88e8e45db141faa9598fbf7ad0062df8f50f881a36ed6a0073e1572126/ordereddict-1.1.tar.gz
Collecting packaging==16.8 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 108))
Downloading https://files.pythonhosted.org/packages/87/1b/c39b7c65b5612812b83d6cab7ef2885eac9f6beb0b7b8a7071a186aea3b1/packaging-16.8-py2.py3-none-any.whl
Collecting parsedatetime==2.1 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 111))
Downloading https://files.pythonhosted.org/packages/85/1f/13fc06097e516f6259d62cea502b116451321c96e18a9d0fff9da3442e02/parsedatetime-2.1-py2-none-any.whl
Collecting pbr==1.8.1 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 114))
Downloading https://files.pythonhosted.org/packages/fc/37/94af8387babb09796d306b18cf94ee5c70388c875a16d8a88e471500452c/pbr-1.8.1-py2.py3-none-any.whl (89kB)
Collecting pyOpenSSL==16.2.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 117))
Downloading https://files.pythonhosted.org/packages/ac/93/b4cd538d31adacd07f83013860db6b88d78755af1f3fefe68ec22d397e7b/pyOpenSSL-16.2.0-py2.py3-none-any.whl (43kB)
Collecting pyparsing==2.1.8 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 120))
Downloading https://files.pythonhosted.org/packages/85/b9/188515f35f78533b3f82966a2c3f1a71a86df8b801367ee75a77191a861d/pyparsing-2.1.8-py2.py3-none-any.whl (54kB)
Collecting pyRFC3339==1.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 129))
Downloading https://files.pythonhosted.org/packages/9b/0a/decfa17e7707afca17d6e9595ff5c79c1c71c74063ad95576f897ed3a9f1/pyRFC3339-1.0-py2.py3-none-any.whl
Collecting python-augeas==0.5.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 132))
Downloading https://files.pythonhosted.org/packages/41/e6/4b6740cb3e31b82252099994cea751c648b846aa7874343c31d68c2215be/python-augeas-0.5.0.tar.gz (90kB)
Collecting pytz==2015.7 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 135))
Downloading https://files.pythonhosted.org/packages/c0/28/973f0382c803b21734cd7e97e0590928148ee21b1cbe8f7fed8b506204fb/pytz-2015.7-py2.py3-none-any.whl (476kB)
Collecting requests==2.20.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 149))
Downloading https://files.pythonhosted.org/packages/f1/ca/10332a30cb25b627192b4ea272c351bce3ca1091e541245cccbace6051d8/requests-2.20.0-py2.py3-none-any.whl (60kB)
Collecting six==1.10.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 152))
Downloading https://files.pythonhosted.org/packages/c8/0a/b6723e1bc4c516cb687841499455a8505b44607ab535be01091c0f24f079/six-1.10.0-py2.py3-none-any.whl
Collecting traceback2==1.4.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 155))
Downloading https://files.pythonhosted.org/packages/17/0a/6ac05a3723017a967193456a2efa0aa9ac4b51456891af1e2353bb9de21e/traceback2-1.4.0-py2.py3-none-any.whl
Collecting unittest2==1.1.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 158))
Downloading https://files.pythonhosted.org/packages/72/20/7f0f433060a962200b7272b8c12ba90ef5b903e218174301d0abfd523813/unittest2-1.1.0-py2.py3-none-any.whl (96kB)
Collecting zope.component==4.2.2 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 161))
Downloading https://files.pythonhosted.org/packages/4c/c4/3f77127c876f49af478e8ea4dc223cda17730bb273c0d1606a4114c64008/zope.component-4.2.2.tar.gz (546kB)
Collecting zope.event==4.1.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 164))
Downloading https://files.pythonhosted.org/packages/0e/87/75e3d62a3506953c2e56d15a150de31e5d92310e87db2c8b102dc01b0b8e/zope.event-4.1.0.tar.gz (476kB)
Collecting zope.interface==4.1.3 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 167))
Downloading https://files.pythonhosted.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz (141kB)
Collecting requests-toolbelt==0.8.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 185))
Downloading https://files.pythonhosted.org/packages/97/8a/d710f792d6f6ecc089c5e55b66e66c3f2f35516a1ede5a8f54c13350ffb0/requests_toolbelt-0.8.0-py2.py3-none-any.whl (54kB)
Collecting chardet==3.0.2 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 188))
Downloading https://files.pythonhosted.org/packages/b8/74/54fdc2fcfdd46b6c486964b64c5bb7db9a3664033ab25cf11aab06dd2a5d/chardet-3.0.2-py2.py3-none-any.whl (133kB)
Collecting urllib3==1.24.1 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 191))
Downloading https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB)
Collecting certifi==2017.4.17 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 194))
Downloading https://files.pythonhosted.org/packages/eb/01/c1f58987b777d6c4ec535b4e004a4a07bfc9db06f0c7533367ca6da8f2a6/certifi-2017.4.17-py2.py3-none-any.whl (375kB)
Collecting letsencrypt==0.7.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 205))
Downloading https://files.pythonhosted.org/packages/fd/21/0c6f33829fadec8aca0c1ebb4d6f8101c05899356a58d1b2e506cb77cf18/letsencrypt-0.7.0-py2-none-any.whl
Collecting certbot==0.30.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 209))
Downloading https://files.pythonhosted.org/packages/e0/5e/9881564f386c1294d6cf387d5c754d7eb3277507b46afac1c646d6ae6de6/certbot-0.30.0-py2.py3-none-any.whl (317kB)
Collecting acme==0.30.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 212))
Downloading https://files.pythonhosted.org/packages/df/a7/fc6114c715233ab53c9571d3b710d596bc80446eac14e0906362fa69e4b1/acme-0.30.0-py2.py3-none-any.whl (85kB)
Collecting certbot-apache==0.30.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 215))
Downloading https://files.pythonhosted.org/packages/37/37/46433ff4358e12d1caf4101308411bf1dad0df3e27e2e62c5037ca75d2e0/certbot_apache-0.30.0-py2.py3-none-any.whl (228kB)
Collecting certbot-nginx==0.30.0 (from -r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 218))
Downloading https://files.pythonhosted.org/packages/ad/15/7f42f31ba068f837816647135a0704a8c89aad685df160407e92870c0277/certbot_nginx-0.30.0-py2.py3-none-any.whl (90kB)
Requirement already satisfied: setuptools>=1.0 in /opt/eff.org/certbot/venv/lib/python2.7/dist-packages (from josepy==1.1.0->-r /tmp/tmp.8vZyi2Q2zy/letsencrypt-auto-requirements.txt (line 95)) (40.6.3)
Exception:
Traceback (most recent call last):
File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/pip/_internal/cli/base_command.py", line 176, in main
status = self.run(options, args)
File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/pip/_internal/commands/install.py", line 346, in run
session=session, autobuilding=True
File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/pip/_internal/wheel.py", line 848, in build
assert building_is_possible
AssertionError
=====================================================

Certbot has problem setting up the virtual environment.

We were not be able to guess the right solution from your pip
output.

Consult https://certbot.eff.org/docs/install.html#problems-with-python-virtual-environment
for possible solutions.
You may also find some support resources at https://certbot.eff.org/support/ .

# Fixed code
def main():
    pip_version = StrictVersion(
        check_output(["pip", "--version"]).decode("utf-8").split()[1]
    )
    has_pip_cache = pip_version >= StrictVersion("6.0")
    index_base = get_index_base()
    temp = mkdtemp(prefix="pipstrap-")
    try:
        downloads = [
            hashed_download(index_base + "/packages/" + path, temp, digest)
            for path, digest in PACKAGES
        ]
        check_output(
            "pip install --no-index --no-deps -U "
            +
            # Disable cache since we're not using it and it otherwise
            # sometimes throws permission warnings:
            ("--no-cache-dir " if has_pip_cache else "")
            + " ".join(quote(d) for d in downloads),
            shell=True,
        )
    except HashError as exc:
        print(exc)
    except Exception:
        rmtree(temp)
        raise
    else:
        rmtree(temp)
        return 0
    return 1