ImportError:导入Docker SDK for Python时没有名为ssl_match_hostname的模块

Kur*_*eek 11 python docker

为了使用Docker SDK for Python,我正在尝试import docker使用Python脚本,但它产生ImportError了以下回溯:

Traceback (most recent call last):
  File "/home/kurt/dev/clones8/ipercron-compose/furion/iclib/tests/test_utils/docker_utils.py", line 1, in <module>
    import docker
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/__init__.py", line 6, in <module>
    from .client import Client, AutoVersionClient, from_env # flake8: noqa
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/client.py", line 11, in <module>
    from . import api
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/api/__init__.py", line 2, in <module>
    from .build import BuildApiMixin
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/api/build.py", line 9, in <module>
    from .. import utils
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/utils/__init__.py", line 2, in <module>
    from .utils import (
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/utils/utils.py", line 19, in <module>
    from .. import tls
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/tls.py", line 5, in <module>
    from .ssladapter import ssladapter
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/ssladapter/__init__.py", line 1, in <module>
    from .ssladapter import SSLAdapter # flake8: noqa
  File "/home/kurt/.local/lib/python2.7/site-packages/docker/ssladapter/ssladapter.py", line 21, in <module>
    from backports.ssl_match_hostname import match_hostname
ImportError: No module named ssl_match_hostname
[Finished in 0.2s with exit code 1]
[shell_cmd: python -u "/home/kurt/dev/clones8/ipercron-compose/furion/iclib/tests/test_utils/docker_utils.py"]
[dir: /home/kurt/dev/clones8/ipercron-compose/furion/iclib/tests/test_utils]
[path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]
Run Code Online (Sandbox Code Playgroud)

奇怪的是导入确实在其他地方工作,例如在iPython提示符中:

Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
Type "copyright", "credits" or "license" for more information.

IPython 2.4.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import docker

In [2]: 
Run Code Online (Sandbox Code Playgroud)

为什么导入在第一种情况下不起作用?

CGF*_*FoX 37

升级docker并没有解决我的问题.相反,我必须将backports安装为Ubuntu包(并从pip卸载):

sudo pip uninstall backports.ssl-match-hostname
sudo apt-get install python-backports.ssl-match-hostname
Run Code Online (Sandbox Code Playgroud)


fgi*_*eau 7

在 Ubuntu/Debian 上,目前有一个与软件包升级相关的错误 ( bug #893520 ),__init__.py文件未生成。

检查以下文件是否存在: /usr/lib/python2.7/dist-packages/backports/__init__.py

如果它不存在并且python-backports.ssl-match-hostname安装了该包,则运行以下命令以生成丢失的文件:

sudo pycompile -p python-backports.ssl-match-hostname
Run Code Online (Sandbox Code Playgroud)


Kur*_*eek 6

我已backports.ssl-match-hostname在本地安装,这阻止了它在系统级别安装.我解决了

sudo pip uninstall backports.ssl-match-hostname
Run Code Online (Sandbox Code Playgroud)

其次是

sudo pip install --upgrade docker
Run Code Online (Sandbox Code Playgroud)


Shu*_*wal 5

由于 Docker-compose 和 Docker 的不同版本,问题可能存在。首先比较版本并升级它以使其兼容。

其次,您可以卸载 backport 包(通过 pip)。

sudo pip uninstall backports.ssl-match-hostname
Run Code Online (Sandbox Code Playgroud)

然后将其作为 ubuntu 包再次安装。

sudo apt-get install python-backports.ssl-match-hostname
Run Code Online (Sandbox Code Playgroud)