Deleted legacy pip_import rule (#582)

diff --git a/.bazelrc b/.bazelrc
index 8c931b7..f06d343 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -3,8 +3,8 @@
 # This lets us glob() up all the files inside the examples to make them inputs to tests
 # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it)
 # To update these lines, run tools/bazel_integration_test/update_deleted_packages.sh
-build --deleted_packages=examples/build_file_generation,examples/legacy_pip_import/boto,examples/legacy_pip_import/extras,examples/legacy_pip_import/helloworld,examples/pip_install,examples/pip_parse,examples/py_import,examples/relative_requirements
-query --deleted_packages=examples/build_file_generation,examples/legacy_pip_import/boto,examples/legacy_pip_import/extras,examples/legacy_pip_import/helloworld,examples/pip_install,examples/pip_parse,examples/py_import,examples/relative_requirements
+build --deleted_packages=examples/build_file_generation,examples/pip_install,examples/pip_parse,examples/py_import,examples/relative_requirements
+query --deleted_packages=examples/build_file_generation,examples/pip_install,examples/pip_parse,examples/py_import,examples/relative_requirements
 
 test --test_output=errors
 
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index f165903..38e0658 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -2,7 +2,6 @@
 
 Please check if your PR fulfills the following requirements:
 
-- [ ] Does not include precompiled binaries, eg. `.par` files. See [CONTRIBUTING.md](https://github.com/bazelbuild/rules_python/blob/master/CONTRIBUTING.md) for info
 - [ ] Tests for the changes have been added (for bug fixes / features)
 - [ ] Docs have been added / updated (for bug fixes / features)
 
diff --git a/.gitignore b/.gitignore
index 3099b78..9df0fb8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,7 @@
 /bazel-genfiles
 /bazel-out
 /bazel-testlogs
+user.bazelrc
 
 # vim swap files
 *.swp
@@ -45,4 +46,4 @@
 # Go/Gazelle files
 # These otherwise match patterns above
 !go.mod
-!BUILD.out
\ No newline at end of file
+!BUILD.out
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 676b60f..da4b625 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -52,28 +52,6 @@
 This needs to be done whenever the docstrings in the corresponding .bzl files
 are changed; a test failure will remind you to run this command when needed.
 
-### Precompiled tools
-
-The packaging rules depend on two precompiled binaries, `tools/piptool.par` and
-`tools/whltool.par`. We need these to be precompiled because they are invoked
-during `WORKSPACE` evaluation, before Bazel itself is able to build anything
-from source. The .par files can be regenerated by running this script in the
-repository root:
-
-```shell
-# You can pass --nodocker if Docker is not available on your system.
-./update_tools.sh
-```
-
-This needs to be done whenever the corresponding sources in the `packaging/`
-directory are updated.
-
-Since these are binary files and therefore unreviewable, for security
-reasons<sup>1</sup> we will regenerate the .par files for you when merging your
-pull request.
-
-<sup>1</sup> See "[Reflections on Trusting Trust](https://en.wikipedia.org/wiki/Backdoor_(computing)#Compiler_backdoors)".
-
 ## Core rules
 
 The bulk of this repo is owned and maintained by the Bazel Python community.
diff --git a/README.md b/README.md
index a35ef7a..0557e85 100644
--- a/README.md
+++ b/README.md
@@ -154,27 +154,6 @@
 install_deps()
 ```
 
-### Importing `pip` dependencies with `pip_import` (legacy)
-
-The deprecated `pip_import` can still be used if needed. It is the only packaging rule that supports Python 2,
-which has been [sunsetted since January 1st, 2020](https://www.python.org/doc/sunset-python-2/). 
-
-```
-load("@rules_python//python/legacy_pip_import:pip.bzl", "pip_import", "pip_repositories")
-
-# Create a central repo that knows about the dependencies needed for requirements.txt.
-pip_import(
-   name = "my_deps",
-   requirements = "//path/to:requirements.txt",
-)
-
-# Load the central repo's install function from its `//:requirements.bzl` file, and call it.
-load("@my_deps//:requirements.bzl", "pip_install")
-pip_install()
-```
-
-An example can be found in [`examples/legacy_pip_import`](examples/legacy_pip_import).
-
 ### Consuming `pip` dependencies
 
 Each extracted wheel repo contains a `py_library` target representing the
diff --git a/docs/pip.md b/docs/pip.md
index de8d1db..ce865a6 100644
--- a/docs/pip.md
+++ b/docs/pip.md
@@ -35,24 +35,6 @@
 | kwargs |  other bazel attributes passed to the "_test" rule   |  none |
 
 
-<a name="#pip_import"></a>
-
-## pip_import
-
-<pre>
-pip_import(<a href="#pip_import-kwargs">kwargs</a>)
-</pre>
-
-    Rule for installing packages listed in a requirements file.
-
-**PARAMETERS**
-
-
-| Name  | Description | Default Value |
-| :-------------: | :-------------: | :-------------: |
-| kwargs |  <p align="center"> - </p>   |  none |
-
-
 <a name="#pip_install"></a>
 
 ## pip_install
diff --git a/examples/BUILD b/examples/BUILD
index 826f87c..8188ca7 100644
--- a/examples/BUILD
+++ b/examples/BUILD
@@ -18,11 +18,6 @@
 licenses(["notice"])  # Apache 2.0
 
 bazel_integration_test(
-    name = "legacy_pip_import_example",
-    timeout = "long",
-)
-
-bazel_integration_test(
     name = "pip_install_example",
     timeout = "long",
 )
diff --git a/examples/legacy_pip_import/.bazelrc b/examples/legacy_pip_import/.bazelrc
deleted file mode 100644
index 0dca511..0000000
--- a/examples/legacy_pip_import/.bazelrc
+++ /dev/null
@@ -1,2 +0,0 @@
-# Watch Bazel run, and only run one at a time
-test --test_output=streamed
diff --git a/examples/legacy_pip_import/README.md b/examples/legacy_pip_import/README.md
deleted file mode 100644
index a474a01..0000000
--- a/examples/legacy_pip_import/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# LEGACY pip example
-
-This feature has been replaced by the pip_install rule, please see the rules_python 0.1 release notes to migrate.
-
-This shows how you can point Bazel at your requirements.txt file to get dependencies automatically installed.
-
-It also shows how a monorepo might have multiple python packages which each have a separate requirements.txt file.
diff --git a/examples/legacy_pip_import/WORKSPACE b/examples/legacy_pip_import/WORKSPACE
deleted file mode 100644
index 784fbdb..0000000
--- a/examples/legacy_pip_import/WORKSPACE
+++ /dev/null
@@ -1,31 +0,0 @@
-workspace(name = "pip_example")
-
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-
-http_archive(
-    name = "rules_python",
-    sha256 = "cd6730ed53a002c56ce4e2f396ba3b3be262fd7cb68339f0377a45e8227fe332",
-    url = "https://github.com/bazelbuild/rules_python/releases/download/0.5.0/rules_python-0.5.0.tar.gz",
-)
-
-load("@rules_python//python/legacy_pip_import:pip.bzl", "pip_import", "pip_repositories")
-
-pip_repositories()
-
-pip_import(
-    name = "boto_deps",
-    requirements = "//boto:requirements.txt",
-)
-
-load("@boto_deps//:requirements.bzl", _boto_install = "pip_install")
-
-_boto_install()
-
-pip_import(
-    name = "extras_deps",
-    requirements = "//extras:requirements.txt",
-)
-
-load("@extras_deps//:requirements.bzl", _extras_install = "pip_install")
-
-_extras_install()
diff --git a/examples/legacy_pip_import/boto/BUILD b/examples/legacy_pip_import/boto/BUILD
deleted file mode 100644
index 7bd91d9..0000000
--- a/examples/legacy_pip_import/boto/BUILD
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-load("@boto_deps//:requirements.bzl", "requirement")
-load("@rules_python//python:defs.bzl", "py_test")
-
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2.0
-
-py_test(
-    name = "boto_test",
-    srcs = ["boto_test.py"],
-    python_version = "PY2",
-    deps = [
-        requirement("boto3"),
-        requirement("pip"),
-        # six is a transitive dependency via python-dateutil. Explicitly depend
-        # on it to work around issue #70; see issue #98.
-        requirement("six"),
-    ],
-)
diff --git a/examples/legacy_pip_import/boto/boto_test.py b/examples/legacy_pip_import/boto/boto_test.py
deleted file mode 100644
index 9ee16f4..0000000
--- a/examples/legacy_pip_import/boto/boto_test.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import boto3
-import pip
-import unittest
-
-
-class BotoTest(unittest.TestCase):
-
-  def test_version(self):
-    # Just the minimal assertion that the boto3 import worked
-    self.assertEqual(boto3.__version__, '1.4.7')
-    # Regression test that the pip version is the one requested
-    # see https://github.com/bazelbuild/rules_python/pull/1#discussion_r138349892
-    self.assertEqual(pip.__version__, '9.0.3')
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/examples/legacy_pip_import/boto/requirements.txt b/examples/legacy_pip_import/boto/requirements.txt
deleted file mode 100644
index 8cdea9c..0000000
--- a/examples/legacy_pip_import/boto/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-boto3==1.4.7
-# Release 0.15 appears to have a broken wheel.
-# See https://github.com/bazelbuild/rules_python/issues/205.
-docutils!=0.15.post1
-pip==9.0.3
diff --git a/examples/legacy_pip_import/extras/BUILD b/examples/legacy_pip_import/extras/BUILD
deleted file mode 100644
index a961b4d..0000000
--- a/examples/legacy_pip_import/extras/BUILD
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-load("@extras_deps//:requirements.bzl", "requirement")
-load("@rules_python//python:defs.bzl", "py_test")
-
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])  # Apache 2.0
-
-py_test(
-    name = "extras_test",
-    srcs = ["extras_test.py"],
-    python_version = "PY2",
-    deps = [
-        requirement("google-cloud-language"),
-        # Make sure that we can resolve the "extra" dependency
-        requirement("googleapis-common-protos[grpc]"),
-    ],
-)
diff --git a/examples/legacy_pip_import/extras/extras_test.py b/examples/legacy_pip_import/extras/extras_test.py
deleted file mode 100644
index 3ad249d..0000000
--- a/examples/legacy_pip_import/extras/extras_test.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import unittest
-
-
-# The test is the build itself, which should not work if extras are missing.
-class ExtrasTest(unittest.TestCase):
-  def test_nothing(self):
-    pass
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/examples/legacy_pip_import/extras/requirements.txt b/examples/legacy_pip_import/extras/requirements.txt
deleted file mode 100644
index 49b86eb..0000000
--- a/examples/legacy_pip_import/extras/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-google-cloud-language==0.27.0
-googleapis-common-protos==1.51.0
diff --git a/examples/legacy_pip_import/extras/version_test.py b/examples/legacy_pip_import/extras/version_test.py
deleted file mode 100644
index 084a595..0000000
--- a/examples/legacy_pip_import/extras/version_test.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import pip
-import unittest
-
-
-class VersionTest(unittest.TestCase):
-
-  def test_version(self):
-    self.assertEqual(pip.__version__, '9.0.3')
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/examples/pip_install/.bazelrc b/examples/pip_install/.bazelrc
index b98fc09..9e7ef37 100644
--- a/examples/pip_install/.bazelrc
+++ b/examples/pip_install/.bazelrc
@@ -1 +1,2 @@
-test --test_output=errors
+# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file
+try-import %workspace%/user.bazelrc
diff --git a/examples/pip_parse/.bazelrc b/examples/pip_parse/.bazelrc
new file mode 100644
index 0000000..9e7ef37
--- /dev/null
+++ b/examples/pip_parse/.bazelrc
@@ -0,0 +1,2 @@
+# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file
+try-import %workspace%/user.bazelrc
diff --git a/internal_deps.bzl b/internal_deps.bzl
index e3910a9..a44e0de 100644
--- a/internal_deps.bzl
+++ b/internal_deps.bzl
@@ -1,9 +1,7 @@
 """Dependencies that are needed for rules_python tests and tools."""
 
-load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
 load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
-load("@rules_python//python/legacy_pip_import:pip.bzl", "pip_import")
 
 def rules_python_internal_deps():
     """Fetches all required dependencies for rules_python tests and tools."""
@@ -121,21 +119,6 @@
     )
 
     maybe(
-        git_repository,
-        name = "subpar",
-        remote = "https://github.com/google/subpar",
-        # tag = "2.0.0",
-        commit = "35bb9f0092f71ea56b742a520602da9b3638a24f",
-        shallow_since = "1557863961 -0400",
-    )
-
-    maybe(
-        pip_import,
-        name = "piptool_deps",
-        requirements = "@rules_python//python:requirements.txt",
-    )
-
-    maybe(
         http_archive,
         name = "build_bazel_integration_testing",
         urls = [
diff --git a/internal_setup.bzl b/internal_setup.bzl
index 9523f75..63385c9 100644
--- a/internal_setup.bzl
+++ b/internal_setup.bzl
@@ -3,12 +3,6 @@
 load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
 load("@build_bazel_integration_testing//tools:repositories.bzl", "bazel_binaries")
 load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
-
-# Requirements for building our piptool.
-load(
-    "@piptool_deps//:requirements.bzl",
-    _piptool_install = "pip_install",
-)
 load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS")
 load("//gazelle:deps.bzl", _go_repositories = "gazelle_deps")
 load("//python/pip_install:repositories.bzl", "pip_install_dependencies")
@@ -16,9 +10,6 @@
 def rules_python_internal_setup():
     """Setup for rules_python tests and tools."""
 
-    # Requirements for building our piptool.
-    _piptool_install()
-
     # Because we don't use the pip_install rule, we have to call this to fetch its deps
     pip_install_dependencies()
 
diff --git a/packaging/BUILD b/packaging/BUILD
deleted file mode 100644
index 237e0ba..0000000
--- a/packaging/BUILD
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-load("@piptool_deps//:requirements.bzl", "requirement")
-load("@subpar//:subpar.bzl", "par_binary")
-load("//python:defs.bzl", "py_library", "py_test")
-
-licenses(["notice"])  # Apache 2.0
-
-py_library(
-    name = "whl",
-    srcs = ["whl.py"],
-    deps = [
-        requirement("setuptools"),
-    ],
-)
-
-py_test(
-    name = "whl_test",
-    srcs = ["whl_test.py"],
-    data = [
-        "@futures_2_2_0_whl//file",
-        "@futures_3_1_1_whl//file",
-        "@google_cloud_language_whl//file",
-        "@grpc_whl//file",
-        "@mock_whl//file",
-    ],
-    deps = [
-        ":whl",
-        requirement("mock"),
-    ],
-)
-
-par_binary(
-    name = "piptool",
-    srcs = ["piptool.py"],
-    deps = [
-        ":whl",
-        requirement("pip"),
-        requirement("wheel"),
-    ],
-)
-
-par_binary(
-    name = "whltool",
-    srcs = ["whl.py"],
-    main = "whl.py",
-    deps = [
-        ":whl",
-    ],
-)
diff --git a/packaging/piptool.py b/packaging/piptool.py
deleted file mode 100644
index 9eab1cd..0000000
--- a/packaging/piptool.py
+++ /dev/null
@@ -1,248 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""The piptool module imports pip requirements into Bazel rules."""
-
-import argparse
-import atexit
-import json
-import os
-import pkgutil
-import pkg_resources
-import re
-import shutil
-import sys
-import tempfile
-import zipfile
-
-# Note: We carefully import the following modules in a particular
-# order, since these modules modify the import path and machinery.
-import pkg_resources
-
-
-def extract_packages(package_names):
-    """Extract zipfile contents to disk and add to import path"""
-
-    # Set a safe extraction dir
-    extraction_tmpdir = tempfile.mkdtemp()
-    atexit.register(lambda: shutil.rmtree(
-        extraction_tmpdir, ignore_errors=True))
-    pkg_resources.set_extraction_path(extraction_tmpdir)
-
-    # Extract each package to disk
-    dirs_to_add = []
-    for package_name in package_names:
-        req = pkg_resources.Requirement.parse(package_name)
-        extraction_dir = pkg_resources.resource_filename(req, '')
-        dirs_to_add.append(extraction_dir)
-
-    # Add extracted directories to import path ahead of their zip file
-    # counterparts.
-    sys.path[0:0] = dirs_to_add
-    existing_pythonpath = os.environ.get('PYTHONPATH')
-    if existing_pythonpath:
-        dirs_to_add.extend(existing_pythonpath.split(':'))
-    os.environ['PYTHONPATH'] = ':'.join(dirs_to_add)
-
-
-# Wheel, pip, and setuptools are much happier running from actual
-# files on disk, rather than entries in a zipfile.  Extract zipfile
-# contents, add those contents to the path, then import them.
-extract_packages(['pip', 'setuptools', 'wheel'])
-
-# Defeat pip's attempt to mangle sys.path
-saved_sys_path = sys.path
-sys.path = sys.path[:]
-import pip
-sys.path = saved_sys_path
-
-import setuptools
-import wheel
-
-
-def pip_main(argv):
-    # Extract the certificates from the PAR following the example of get-pip.py
-    # https://github.com/pypa/get-pip/blob/430ba37776ae2ad89/template.py#L164-L168
-    cert_tmpdir = tempfile.mkdtemp()
-    cert_path = os.path.join(cert_tmpdir, "cacert.pem")
-    atexit.register(lambda: shutil.rmtree(cert_tmpdir, ignore_errors=True))
-    with open(cert_path, "wb") as cert:
-      cert.write(pkgutil.get_data("pip._vendor.requests", "cacert.pem"))
-    argv = ["--isolated", "--disable-pip-version-check", "--cert", cert_path] + argv
-    return pip.main(argv)
-
-from packaging.whl import Wheel
-
-parser = argparse.ArgumentParser(
-    description='Import Python dependencies into Bazel.')
-
-parser.add_argument('--python_interpreter', action='store',
-                    help=('The Python interpreter to use when extracting '
-                          'wheels.'))
-
-parser.add_argument('--name', action='store',
-                    help=('The namespace of the import.'))
-
-parser.add_argument('--input', action='store',
-                    help=('The requirements.txt file to import.'))
-
-parser.add_argument('--output', action='store',
-                    help=('The requirements.bzl file to export.'))
-
-parser.add_argument('--directory', action='store',
-                    help=('The directory into which to put .whl files.'))
-
-parser.add_argument('--extra_pip_args', action='store',
-                    help=('Extra arguments to pass down to pip.'))
-
-def sort_wheels(whls):
-  """Sorts a list of wheels deterministically."""
-  return sorted(whls, key=lambda w: w.distribution() + '_' + w.version())
-
-def determine_possible_extras(whls):
-  """Determines the list of possible "extras" for each .whl
-
-  The possibility of an extra is determined by looking at its
-  additional requirements, and determinine whether they are
-  satisfied by the complete list of available wheels.
-
-  Args:
-    whls: a list of Wheel objects
-
-  Returns:
-    a dict that is keyed by the Wheel objects in whls, and whose
-    values are lists of possible extras.
-  """
-  whl_map = {
-    whl.distribution(): whl
-    for whl in whls
-  }
-
-  # TODO(mattmoor): Consider memoizing if this recursion ever becomes
-  # expensive enough to warrant it.
-  def is_possible(distro, extra):
-    distro = distro.replace("-", "_")
-    # If we don't have the .whl at all, then this isn't possible.
-    if distro not in whl_map:
-      return False
-    whl = whl_map[distro]
-    # If we have the .whl, and we don't need anything extra then
-    # we can satisfy this dependency.
-    if not extra:
-      return True
-    # If we do need something extra, then check the extra's
-    # dependencies to make sure they are fully satisfied.
-    for extra_dep in whl.dependencies(extra=extra):
-      req = pkg_resources.Requirement.parse(extra_dep)
-      # Check that the dep and any extras are all possible.
-      if not is_possible(req.project_name, None):
-        return False
-      for e in req.extras:
-        if not is_possible(req.project_name, e):
-          return False
-    # If all of the dependencies of the extra are satisfiable then
-    # it is possible to construct this dependency.
-    return True
-
-  return {
-    whl: [
-      extra
-      for extra in sorted(whl.extras())
-      if is_possible(whl.distribution(), extra)
-    ]
-    for whl in whls
-  }
-
-def main():
-  args = parser.parse_args()
-
-  # https://github.com/pypa/pip/blob/9.0.1/pip/__init__.py#L209
-  pip_args = ["wheel", "-w", args.directory, "-r", args.input]
-  if args.extra_pip_args:
-      pip_args += args.extra_pip_args.strip("\"").split()
-  if pip_main(pip_args):
-    sys.exit(1)
-
-  # Enumerate the .whl files we downloaded.
-  def list_whls():
-    dir = args.directory + '/'
-    for root, unused_dirnames, filenames in os.walk(dir):
-      for fname in filenames:
-        if fname.endswith('.whl'):
-          yield os.path.join(root, fname)
-
-  whls = sort_wheels(Wheel(path) for path in list_whls())
-  possible_extras = determine_possible_extras(whls)
-
-  def repository_name(wheel):
-    return args.name + "_" + wheel.repository_suffix()
-
-  def whl_library(wheel):
-    # Indentation here matters.  whl_library must be within the scope
-    # of the function below.  We also avoid reimporting an existing WHL.
-    return """
-  if "{repo_name}" not in native.existing_rules():
-    whl_library(
-        name = "{repo_name}",
-        python_interpreter = "{python_interpreter}",
-        whl = "@{name}//:{path}",
-        requirements = "@{name}//:requirements.bzl",
-        extras = [{extras}]
-    )""".format(name=args.name, repo_name=repository_name(wheel),
-                python_interpreter=args.python_interpreter,
-                path=wheel.basename(),
-                extras=','.join([
-                  '"%s"' % extra
-                  for extra in possible_extras.get(wheel, [])
-                ]))
-
-  whl_targets = ','.join([
-    ','.join([
-      '"%s": "@%s//:pkg"' % (whl.distribution().lower(), repository_name(whl))
-    ] + [
-      # For every extra that is possible from this requirements.txt
-      '"%s[%s]": "@%s//:%s"' % (whl.distribution().lower(), extra.lower(),
-                                repository_name(whl), extra)
-      for extra in possible_extras.get(whl, [])
-    ])
-    for whl in whls
-  ])
-
-  with open(args.output, 'w') as f:
-    f.write("""\
-# Install pip requirements.
-#
-# Generated from {input}
-
-load("@rules_python//python:whl.bzl", "whl_library")
-
-def pip_install():
-  {whl_libraries}
-
-_requirements = {{
-  {mappings}
-}}
-
-all_requirements = _requirements.values()
-
-def requirement(name):
-  name_key = name.replace("-", "_").lower()
-  if name_key not in _requirements:
-    fail("Could not find pip-provided dependency: '%s'" % name)
-  return _requirements[name_key]
-""".format(input=args.input,
-           whl_libraries='\n'.join(map(whl_library, whls)) if whls else "pass",
-           mappings=whl_targets))
-
-if __name__ == '__main__':
-  main()
diff --git a/packaging/whl.py b/packaging/whl.py
deleted file mode 100644
index f30575a..0000000
--- a/packaging/whl.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""The whl modules defines classes for interacting with Python packages."""
-
-import argparse
-import json
-import os
-import pkg_resources
-import re
-import stat
-import zipfile
-
-
-def current_umask():
-    """Get the current umask which involves having to set it temporarily."""
-    mask = os.umask(0)
-    os.umask(mask)
-    return mask
-
-
-def set_extracted_file_to_default_mode_plus_executable(path):
-    """
-    Make file present at path have execute for user/group/world
-    (chmod +x) is no-op on windows per python docs
-    """
-    os.chmod(path, (0o777 & ~current_umask() | 0o111))
-
-
-class Wheel(object):
-
-  def __init__(self, path):
-    self._path = path
-
-  def path(self):
-    return self._path
-
-  def basename(self):
-    return os.path.basename(self.path())
-
-  def distribution(self):
-    # See https://www.python.org/dev/peps/pep-0427/#file-name-convention
-    parts = self.basename().split('-')
-    return parts[0]
-
-  def version(self):
-    # See https://www.python.org/dev/peps/pep-0427/#file-name-convention
-    parts = self.basename().split('-')
-    return parts[1]
-
-  def repository_suffix(self):
-    # Returns a canonical suffix that will form part of the name of the Bazel
-    # repository for this package.
-    canonical = 'pypi__{}_{}'.format(self.distribution(), self.version())
-    # Escape any illegal characters with underscore.
-    return re.sub('[-.+]', '_', canonical)
-
-  def _dist_info(self):
-    # Return the name of the dist-info directory within the .whl file.
-    # e.g. google_cloud-0.27.0-py2.py3-none-any.whl ->
-    #      google_cloud-0.27.0.dist-info
-    return '{}-{}.dist-info'.format(self.distribution(), self.version())
-
-  def metadata(self):
-    # Extract the structured data from metadata.json in the WHL's dist-info
-    # directory.
-    with zipfile.ZipFile(self.path(), 'r') as whl:
-      # first check for metadata.json
-      try:
-        with whl.open(self._dist_info() + '/metadata.json') as f:
-          return json.loads(f.read().decode("utf-8"))
-      except KeyError:
-          pass
-      # fall back to METADATA file (https://www.python.org/dev/peps/pep-0427/)
-      with whl.open(self._dist_info() + '/METADATA') as f:
-        return self._parse_metadata(f.read().decode("utf-8"))
-
-  def name(self):
-    return self.metadata().get('name')
-
-  def dependencies(self, extra=None):
-    """Access the dependencies of this Wheel.
-
-    Args:
-      extra: if specified, include the additional dependencies
-            of the named "extra".
-
-    Yields:
-      the names of requirements from the metadata.json, in lexical order.
-    """
-    # TODO(mattmoor): Is there a schema to follow for this?
-    dependency_set = set()
-
-    run_requires = self.metadata().get('run_requires', [])
-    for requirement in run_requires:
-      if requirement.get('extra') != extra:
-        # Match the requirements for the extra we're looking for.
-        continue
-      marker = requirement.get('environment')
-      if marker and not pkg_resources.evaluate_marker(marker):
-        # The current environment does not match the provided PEP 508 marker,
-        # so ignore this requirement.
-        continue
-      requires = requirement.get('requires', [])
-      for entry in requires:
-        # Strip off any trailing versioning data.
-        parts = re.split('[ ><=()]', entry)
-        dependency_set.add(parts[0])
-
-    return sorted(dependency_set)
-
-  def extras(self):
-    return self.metadata().get('extras', [])
-
-  def expand(self, directory):
-    with zipfile.ZipFile(self.path(), "r", allowZip64=True) as whl:
-        whl.extractall(directory)
-        # The following logic is borrowed from Pip:
-        # https://github.com/pypa/pip/blob/cc48c07b64f338ac5e347d90f6cb4efc22ed0d0b/src/pip/_internal/utils/unpacking.py#L240
-        for info in whl.infolist():
-            name = info.filename
-            # Do not attempt to modify directories.
-            if name.endswith("/") or name.endswith("\\"):
-                continue
-            mode = info.external_attr >> 16
-            # if mode and regular file and any execute permissions for
-            # user/group/world?
-            if mode and stat.S_ISREG(mode) and mode & 0o111:
-                name = os.path.join(directory, name)
-                set_extracted_file_to_default_mode_plus_executable(name)
-
-  # _parse_metadata parses METADATA files according to https://www.python.org/dev/peps/pep-0314/
-  def _parse_metadata(self, content):
-    # TODO: handle fields other than just name
-    name_pattern = re.compile('Name: (.*)')
-    return { 'name': name_pattern.search(content).group(1) }
-
-
-parser = argparse.ArgumentParser(
-    description='Unpack a WHL file as a py_library.')
-
-parser.add_argument('--whl', action='store',
-                    help=('The .whl file we are expanding.'))
-
-parser.add_argument('--requirements', action='store',
-                    help='The pip_import from which to draw dependencies.')
-
-parser.add_argument('--directory', action='store', default='.',
-                    help='The directory into which to expand things.')
-
-parser.add_argument('--extras', action='append',
-                    help='The set of extras for which to generate library targets.')
-
-def main():
-  """
-  Generate a BUILD file for an unzipped Wheel
-
-  We allow for empty Python sources as for Wheels containing only compiled C code
-  there may be no Python sources whatsoever (e.g. packages written in Cython: like `pymssql`).
-  """
-
-  args = parser.parse_args()
-  whl = Wheel(args.whl)
-
-  # Extract the files into the current directory
-  whl.expand(args.directory)
-
-  with open(os.path.join(args.directory, 'BUILD'), 'w') as f:
-    f.write("""
-package(default_visibility = ["//visibility:public"])
-
-load("@rules_python//python:defs.bzl", "py_library")
-load("{requirements}", "requirement")
-
-py_library(
-    name = "pkg",
-    srcs = glob(["**/*.py"], allow_empty = True),
-    data = glob(["**/*"], exclude=["**/*.py", "**/* *", "BUILD", "WORKSPACE"]),
-    # This makes this directory a top-level in the python import
-    # search path for anything that depends on this.
-    imports = ["."],
-    deps = [{dependencies}],
-)
-{extras}""".format(
-  requirements=args.requirements,
-  dependencies=','.join([
-    'requirement("%s")' % d
-    for d in whl.dependencies()
-  ]),
-  extras='\n\n'.join([
-    """py_library(
-    name = "{extra}",
-    deps = [
-        ":pkg",{deps}
-    ],
-)""".format(extra=extra,
-            deps=','.join([
-                'requirement("%s")' % dep
-                for dep in whl.dependencies(extra)
-            ]))
-    for extra in args.extras or []
-  ])))
-
-if __name__ == '__main__':
-  main()
diff --git a/packaging/whl_test.py b/packaging/whl_test.py
deleted file mode 100644
index 1a29f5b..0000000
--- a/packaging/whl_test.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import os
-import unittest
-
-from mock import patch
-
-from packaging import whl
-
-
-def TestData(name):
-  return os.path.join(os.environ['TEST_SRCDIR'], name)
-
-
-class WheelTest(unittest.TestCase):
-
-  def test_grpc_whl(self):
-    td = TestData('grpc_whl/file/grpcio-1.6.0-cp27-cp27m-manylinux1_i686.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(wheel.name(), 'grpcio')
-    self.assertEqual(wheel.distribution(), 'grpcio')
-    self.assertEqual(wheel.version(), '1.6.0')
-    self.assertEqual(set(wheel.dependencies()),
-                     set(['enum34', 'futures', 'protobuf', 'six']))
-    self.assertEqual('pypi__grpcio_1_6_0', wheel.repository_suffix())
-    self.assertEqual([], wheel.extras())
-
-  def test_futures_whl(self):
-    td = TestData('futures_3_1_1_whl/file/futures-3.1.1-py2-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(wheel.name(), 'futures')
-    self.assertEqual(wheel.distribution(), 'futures')
-    self.assertEqual(wheel.version(), '3.1.1')
-    self.assertEqual(set(wheel.dependencies()), set())
-    self.assertEqual('pypi__futures_3_1_1', wheel.repository_suffix())
-    self.assertEqual([], wheel.extras())
-
-  def test_whl_with_METADATA_file(self):
-    td = TestData('futures_2_2_0_whl/file/futures-2.2.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(wheel.name(), 'futures')
-    self.assertEqual(wheel.distribution(), 'futures')
-    self.assertEqual(wheel.version(), '2.2.0')
-    self.assertEqual(set(wheel.dependencies()), set())
-    self.assertEqual('pypi__futures_2_2_0', wheel.repository_suffix())
-
-  @patch('platform.python_version', return_value='2.7.13')
-  def test_mock_whl(self, *args):
-    td = TestData('mock_whl/file/mock-2.0.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(wheel.name(), 'mock')
-    self.assertEqual(wheel.distribution(), 'mock')
-    self.assertEqual(wheel.version(), '2.0.0')
-    self.assertEqual(set(wheel.dependencies()),
-                     set(['funcsigs', 'pbr', 'six']))
-    self.assertEqual('pypi__mock_2_0_0', wheel.repository_suffix())
-
-  @patch('platform.python_version', return_value='3.3.0')
-  def test_mock_whl_3_3(self, *args):
-    td = TestData('mock_whl/file/mock-2.0.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(set(wheel.dependencies()),
-                     set(['pbr', 'six']))
-
-  @patch('platform.python_version', return_value='2.7.13')
-  def test_mock_whl_extras(self, *args):
-    td = TestData('mock_whl/file/mock-2.0.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(['docs', 'test'], wheel.extras())
-    self.assertEqual(set(wheel.dependencies(extra='docs')), set(['sphinx']))
-    self.assertEqual(set(wheel.dependencies(extra='test')), set(['unittest2']))
-
-  @patch('platform.python_version', return_value='3.0.0')
-  def test_mock_whl_extras_3_0(self, *args):
-    td = TestData('mock_whl/file/mock-2.0.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(['docs', 'test'], wheel.extras())
-    self.assertEqual(set(wheel.dependencies(extra='docs')), set(['sphinx', 'Pygments', 'jinja2']))
-    self.assertEqual(set(wheel.dependencies(extra='test')), set(['unittest2']))
-
-  @patch('platform.python_version', return_value='2.7.13')
-  def test_google_cloud_language_whl(self, *args):
-    td = TestData('google_cloud_language_whl/file/' +
-                  'google_cloud_language-0.29.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    self.assertEqual(wheel.name(), 'google-cloud-language')
-    self.assertEqual(wheel.distribution(), 'google_cloud_language')
-    self.assertEqual(wheel.version(), '0.29.0')
-    expected_deps = ['google-gax', 'google-cloud-core',
-                     'googleapis-common-protos[grpc]', 'enum34']
-    self.assertEqual(set(wheel.dependencies()),
-                     set(expected_deps))
-    self.assertEqual('pypi__google_cloud_language_0_29_0',
-                     wheel.repository_suffix())
-    self.assertEqual([], wheel.extras())
-
-  @patch('platform.python_version', return_value='3.4.0')
-  def test_google_cloud_language_whl_3_4(self, *args):
-    td = TestData('google_cloud_language_whl/file/' +
-                  'google_cloud_language-0.29.0-py2.py3-none-any.whl')
-    wheel = whl.Wheel(td)
-    expected_deps = ['google-gax', 'google-cloud-core',
-                     'googleapis-common-protos[grpc]']
-    self.assertEqual(set(wheel.dependencies()),
-                     set(expected_deps))
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/BUILD b/python/BUILD
index 972bf9e..9470ad6 100644
--- a/python/BUILD
+++ b/python/BUILD
@@ -24,8 +24,6 @@
 that @rules_python//python is only concerned with the core rules.
 """
 
-load("//python/pip_install:requirements.bzl", "compile_pip_requirements")
-
 package(default_visibility = ["//visibility:public"])
 
 licenses(["notice"])  # Apache 2.0
@@ -34,7 +32,6 @@
     name = "distribution",
     srcs = glob(["**"]) + [
         "//python/constraints:distribution",
-        "//python/legacy_pip_import:distribution",
         "//python/runfiles:distribution",
         "//python/private:distribution",
     ],
@@ -140,8 +137,3 @@
     "pip.bzl",
     "whl.bzl",
 ])
-
-compile_pip_requirements(
-    name = "requirements",
-    extra_args = ["--allow-unsafe"],
-)
diff --git a/python/legacy_pip_import/BUILD b/python/legacy_pip_import/BUILD
deleted file mode 100644
index d76747a..0000000
--- a/python/legacy_pip_import/BUILD
+++ /dev/null
@@ -1,8 +0,0 @@
-filegroup(
-    name = "distribution",
-    srcs = [
-        "BUILD",
-        "pip.bzl",
-    ],
-    visibility = ["//python:__pkg__"],
-)
diff --git a/python/legacy_pip_import/pip.bzl b/python/legacy_pip_import/pip.bzl
deleted file mode 100644
index e2b1b87..0000000
--- a/python/legacy_pip_import/pip.bzl
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Import pip requirements into Bazel."""
-
-def _pip_import_impl(repository_ctx):
-    """Core implementation of pip_import."""
-
-    # Add an empty top-level BUILD file.
-    # This is because Bazel requires BUILD files along all paths accessed
-    # via //this/sort/of:path and we wouldn't be able to load our generated
-    # requirements.bzl without it.
-    repository_ctx.file("BUILD", "")
-
-    interpreter_path = repository_ctx.attr.python_interpreter
-    if repository_ctx.attr.python_interpreter_target != None:
-        target = repository_ctx.attr.python_interpreter_target
-        interpreter_path = repository_ctx.path(target)
-
-    args = [
-        interpreter_path,
-        repository_ctx.path(repository_ctx.attr._script),
-        "--python_interpreter",
-        interpreter_path,
-        "--name",
-        repository_ctx.attr.name,
-        "--input",
-        repository_ctx.path(repository_ctx.attr.requirements),
-        "--output",
-        repository_ctx.path("requirements.bzl"),
-        "--directory",
-        repository_ctx.path(""),
-    ]
-    if repository_ctx.attr.extra_pip_args:
-        args += [
-            "--extra_pip_args",
-            "\"" + " ".join(repository_ctx.attr.extra_pip_args) + "\"",
-        ]
-
-    # To see the output, pass: quiet=False
-    result = repository_ctx.execute(args, timeout = repository_ctx.attr.timeout)
-
-    if result.return_code:
-        fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr))
-
-pip_import = repository_rule(
-    attrs = {
-        "extra_pip_args": attr.string_list(
-            doc = "Extra arguments to pass on to pip. Must not contain spaces.",
-        ),
-        "python_interpreter": attr.string(default = "python", doc = """
-The command to run the Python interpreter used to invoke pip and unpack the
-wheels.
-"""),
-        "python_interpreter_target": attr.label(allow_single_file = True, doc = """
-If you are using a custom python interpreter built by another repository rule,
-use this attribute to specify its BUILD target. This allows pip_import to invoke
-pip using the same interpreter as your toolchain. If set, takes precedence over
-python_interpreter.
-"""),
-        "requirements": attr.label(
-            mandatory = True,
-            allow_single_file = True,
-            doc = "The label of the requirements.txt file.",
-        ),
-        "timeout": attr.int(
-            default = 600,
-            doc = "Timeout (in seconds) for repository fetch.",
-        ),
-        "_script": attr.label(
-            executable = True,
-            default = Label("//tools:piptool.par"),
-            cfg = "host",
-        ),
-    },
-    implementation = _pip_import_impl,
-    doc = """A rule for importing `requirements.txt` dependencies into Bazel.
-
-This rule imports a `requirements.txt` file and generates a new
-`requirements.bzl` file.  This is used via the `WORKSPACE` pattern:
-
-```python
-pip_import(
-    name = "foo",
-    requirements = ":requirements.txt",
-)
-load("@foo//:requirements.bzl", "pip_install")
-pip_install()
-```
-
-You can then reference imported dependencies from your `BUILD` file with:
-
-```python
-load("@foo//:requirements.bzl", "requirement")
-py_library(
-    name = "bar",
-    ...
-    deps = [
-       "//my/other:dep",
-       requirement("futures"),
-       requirement("mock"),
-    ],
-)
-```
-
-Or alternatively:
-```python
-load("@foo//:requirements.bzl", "all_requirements")
-py_binary(
-    name = "baz",
-    ...
-    deps = [
-       ":foo",
-    ] + all_requirements,
-)
-```
-""",
-)
-
-# We don't provide a `pip2_import` that would use the `python2` system command
-# because this command does not exist on all platforms. On most (but not all)
-# systems, `python` means Python 2 anyway. See also #258.
-
-def pip3_import(**kwargs):
-    """A wrapper around pip_import that uses the `python3` system command.
-
-    Use this for requirements of PY3 programs.
-    """
-    pip_import(python_interpreter = "python3", **kwargs)
-
-def pip_repositories():
-    # buildifier: disable=print
-    print("DEPRECATED: the pip_import rule has been replaced with pip_install, please see rules_python 0.1 release notes")
diff --git a/python/pip.bzl b/python/pip.bzl
index cac11c2..7776efe 100644
--- a/python/pip.bzl
+++ b/python/pip.bzl
@@ -199,15 +199,3 @@
 
     # buildifier: disable=print
     print("DEPRECATED: the pip_repositories rule has been replaced with pip_install, please see rules_python 0.1 release notes")
-
-def pip_import(**kwargs):
-    """
-    Rule for installing packages listed in a requirements file.
-
-    Deprecated:
-        the pip_import rule has been replaced with pip_install.
-    """
-    fail("=" * 79 + """\n
-    pip_import has been replaced with pip_install, please see the rules_python 0.1 release notes.
-    To continue using it, you can load from "@rules_python//python/legacy_pip_import:pip.bzl"
-    """)
diff --git a/python/requirements.in b/python/requirements.in
deleted file mode 100644
index cae7f29..0000000
--- a/python/requirements.in
+++ /dev/null
@@ -1,10 +0,0 @@
-pip==9.0.3
-setuptools==44.0.0
-wheel==0.30.0a0
-
-# For tests
-mock==2.0.0
-# This is a transitive dependency of mock, which only appears on some python versions
-# Right now our repo doesn't pin our Python interpreter, so our locked requirements
-# may differ between local dev and CI, for example.
-funcsigs==1.0.2
diff --git a/python/requirements.txt b/python/requirements.txt
deleted file mode 100644
index 9bba20d..0000000
--- a/python/requirements.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# This file is autogenerated by pip-compile
-# To update, run:
-#
-#    bazel run //python:requirements.update
-#
-funcsigs==1.0.2 \
-    --hash=sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca \
-    --hash=sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50
-    # via -r python/requirements.in
-mock==2.0.0 \
-    --hash=sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1 \
-    --hash=sha256:b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba
-    # via -r python/requirements.in
-pbr==5.5.1 \
-    --hash=sha256:5fad80b613c402d5b7df7bd84812548b2a61e9977387a80a5fc5c396492b13c9 \
-    --hash=sha256:b236cde0ac9a6aedd5e3c34517b423cd4fd97ef723849da6b0d2231142d89c00
-    # via mock
-six==1.15.0 \
-    --hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \
-    --hash=sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced
-    # via mock
-wheel==0.30.0a0 \
-    --hash=sha256:98f3e09b4ad7f5649a7e3d00e0e005ec1824ddcd6ec16c5086c05b1d91ada6da \
-    --hash=sha256:cd19aa9325d3af1c641b0a23502b12696159171d2a2f4b84308df9a075c2a4a0
-    # via -r python/requirements.in
-
-# The following packages are considered to be unsafe in a requirements file:
-pip==9.0.3 \
-    --hash=sha256:7bf48f9a693be1d58f49f7af7e0ae9fe29fd671cde8a55e6edca3581c4ef5796 \
-    --hash=sha256:c3ede34530e0e0b2381e7363aded78e0c33291654937e7373032fda04e8803e5
-    # via -r python/requirements.in
-setuptools==44.0.0 \
-    --hash=sha256:180081a244d0888b0065e18206950d603f6550721bd6f8c0a10221ed467dd78e \
-    --hash=sha256:e5baf7723e5bb8382fc146e33032b241efc63314211a3a120aaa55d62d2bb008
-    # via -r python/requirements.in
diff --git a/tools/BUILD b/tools/BUILD
index 0e3cf70..789bc2b 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -23,19 +23,11 @@
     srcs = ["wheelmaker.py"],
 )
 
-# These files are generated and updated by ./update_tools.sh
-exports_files([
-    "piptool.par",
-    "whltool.par",
-])
-
 filegroup(
     name = "distribution",
     srcs = [
         "BUILD",
         "wheelmaker.py",
-    ] + glob([
-        "*.par",
-    ]),
+    ],
     visibility = ["//:__pkg__"],
 )
diff --git a/tools/piptool.par b/tools/piptool.par
deleted file mode 100755
index a94cd4d..0000000
--- a/tools/piptool.par
+++ /dev/null
Binary files differ
diff --git a/tools/update_tools/Dockerfile b/tools/update_tools/Dockerfile
deleted file mode 100644
index 1864fd1..0000000
--- a/tools/update_tools/Dockerfile
+++ /dev/null
@@ -1,35 +0,0 @@
-FROM gcr.io/gcp-runtimes/ubuntu_16_0_4:latest
-
-# Install Bazel (https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu).
-RUN apt-get update -y && apt-get install -y \
-    # The JDK requirement is from the instructions for the bazel apt package,
-    # which we're not using here, but let's be safe.
-    openjdk-8-jdk \
-    # These requirements are from the link above.
-    pkg-config zip g++ zlib1g-dev unzip python3 \
-    # And why should python3 have all the fun?
-    python \
-    # We also need git for git_repository to work. Maybe these other ones too.
-    git unzip build-essential \
-    # And wget for the below command.
-    wget
-
-RUN wget https://github.com/bazelbuild/bazel/releases/download/0.28.0/bazel-0.28.0-installer-linux-x86_64.sh -O /tmp/bazel-installer.sh
-RUN chmod +x /tmp/bazel-installer.sh && /tmp/bazel-installer.sh
-
-# Sanity check the install.
-RUN bazel help info >/dev/null 2>&1
-
-# Build par files.  We have a source and work directory to avoid stomping on
-# other files as root.
-CMD cp -r /opt/rules_python_source /opt/rules_python && \
-    cd /opt/rules_python && \
-    bazel clean && \
-    bazel build //packaging:piptool.par //packaging:whltool.par \
-        # This works around a bug in git_repository to give us better debugging
-        # if there's an error.
-        # TODO(brandjon): Remove this once we're using Bazel 0.29, which
-        # contains the fix.
-        --incompatible_string_join_requires_strings=false && \
-    cp bazel-bin/packaging/piptool.par bazel-bin/packaging/whltool.par /opt/rules_python_source/tools/ && \
-    chown --reference=/opt/rules_python_source/update_tools.sh /opt/rules_python_source/tools/piptool.par /opt/rules_python_source/tools/whltool.par
diff --git a/tools/whltool.par b/tools/whltool.par
deleted file mode 100755
index 36074db..0000000
--- a/tools/whltool.par
+++ /dev/null
Binary files differ
diff --git a/update_tools.sh b/update_tools.sh
deleted file mode 100755
index 41ca047..0000000
--- a/update_tools.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-set -euo pipefail
-
-usage() {
-  echo "Usage: $0 [--nodocker]" 1>&2
-  exit 1
-}
-
-if [ "$#" -eq 0 ] ; then
-  docker build --no-cache -f tools/update_tools/Dockerfile --tag rules_python:update_tools .
-  docker run -v"$PWD":/opt/rules_python_source rules_python:update_tools
-elif [ "$#" -eq 1 -a "$1" == "--nodocker" ] ; then
-  bazel build //packaging:piptool.par //packaging:whltool.par
-  cp bazel-bin/packaging/piptool.par tools/piptool.par
-  cp bazel-bin/packaging/whltool.par tools/whltool.par
-else
-  usage
-fi