فهرست منبع

Don't import pip inside Compose

Signed-off-by: Joffrey F <[email protected]>
Joffrey F 8 سال پیش
والد
کامیت
66f4a795a2
2فایلهای تغییر یافته به همراه37 افزوده شده و 24 حذف شده
  1. 37 0
      compose/cli/__init__.py
  2. 0 24
      compose/cli/main.py

+ 37 - 0
compose/cli/__init__.py

@@ -0,0 +1,37 @@
+from __future__ import absolute_import
+from __future__ import print_function
+from __future__ import unicode_literals
+
+import subprocess
+import sys
+
+# Attempt to detect https://github.com/docker/compose/issues/4344
+try:
+    # We don't try importing pip because it messes with package imports
+    # on some Linux distros (Ubuntu, Fedora)
+    # https://github.com/docker/compose/issues/4425
+    # https://github.com/docker/compose/issues/4481
+    # https://github.com/pypa/pip/blob/master/pip/_vendor/__init__.py
+    s_cmd = subprocess.Popen(
+        ['pip', 'freeze'], stderr=subprocess.PIPE, stdout=subprocess.PIPE
+    )
+    packages = s_cmd.communicate()[0].splitlines()
+    dockerpy_installed = len(
+        list(filter(lambda p: p.startswith(b'docker-py=='), packages))
+    ) > 0
+    if dockerpy_installed:
+        from .colors import red
+        print(
+            red('ERROR:'),
+            "Dependency conflict: an older version of the 'docker-py' package "
+            "is polluting the namespace. "
+            "Run the following command to remedy the issue:\n"
+            "pip uninstall docker docker-py; pip install docker",
+            file=sys.stderr
+        )
+        sys.exit(1)
+
+except OSError:
+    # pip command is not available, which indicates it's probably the binary
+    # distribution of Compose which is not affected
+    pass

+ 0 - 24
compose/cli/main.py

@@ -14,30 +14,6 @@ from distutils.spawn import find_executable
 from inspect import getdoc
 from operator import attrgetter
 
-
-# Attempt to detect https://github.com/docker/compose/issues/4344
-try:
-    # A regular import statement causes PyInstaller to freak out while
-    # trying to load pip. This way it is simply ignored.
-    pip = __import__('pip')
-    pip_packages = pip.get_installed_distributions()
-    if 'docker-py' in [pkg.project_name for pkg in pip_packages]:
-        from .colors import red
-        print(
-            red('ERROR:'),
-            "Dependency conflict: an older version of the 'docker-py' package "
-            "is polluting the namespace. "
-            "Run the following command to remedy the issue:\n"
-            "pip uninstall docker docker-py; pip install docker",
-            file=sys.stderr
-        )
-        sys.exit(1)
-except ImportError:
-    # pip is not available, which indicates it's probably the binary
-    # distribution of Compose which is not affected
-    pass
-
-
 from . import errors
 from . import signals
 from .. import __version__