torsava / rpms / python-pip

Forked from rpms/python-pip 4 years ago
Clone
Blob Blame History Raw
diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py
index 8c0e4c58..76e280e5 100755
--- a/src/pip/_internal/__init__.py
+++ b/src/pip/_internal/__init__.py
@@ -1,2 +1,3 @@
 #!/usr/bin/env python
 import pip._internal.utils.inject_securetransport  # noqa
+from pip._internal import main  # noqa
diff --git a/src/pip/_internal/main.py b/src/pip/_internal/main.py
index 1e922402..d3df58b3 100644
--- a/src/pip/_internal/main.py
+++ b/src/pip/_internal/main.py
@@ -45,3 +45,30 @@ def main(args=None):
     command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
 
     return command.main(cmd_args)
+
+
+# Dark magic to make the main module itself callable.
+# This is needed to be able to use this pip in ensurepip of older Pythons
+# without patching all the Pythons.
+
+# In Python 3.5+, we can just inherit, define __call__ and override
+# sys.modules[__name__].__class__, however, that is not possible in 2.7.
+
+class _CallableModule(type(sys.modules[__name__])):
+    def __init__(self):
+        super(_CallableModule, self).__init__(__name__)
+        self._main = sys.modules[__name__]
+        sys.modules[__name__] = self
+        self.__doc__ = self._main.__doc__
+
+    def __call__(self, *args, **kwargs):
+        return main(*args, **kwargs)
+
+    def __dir__(self):
+        return dir(self._main)
+
+    def __getattr__(self, attr):
+        return getattr(self._main, attr)
+
+
+_CallableModule()