簡體   English   中英

ImportError:導入用於Python的Docker SDK時,沒有名為ssl_match_hostname的模塊

[英]ImportError: No module named ssl_match_hostname when importing the docker SDK for Python

為了使用適用於PythonDocker SDK ,我嘗試以Python腳本import docker ,但是這會導致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]

奇怪的是,導入確實可以在其他地方工作,例如在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]: 

為什么在第一種情況下導入不起作用?

升級docker並不能解決我的問題。 相反,我必須將反向端口安裝為Ubuntu軟件包(並從pip卸載):

sudo pip uninstall backports.ssl-match-hostname
sudo apt-get install python-backports.ssl-match-hostname

我在本地安裝了backports.ssl-match-hostname ,這阻止了它在系統級別安裝。 我解決了

sudo pip uninstall backports.ssl-match-hostname

其次是

sudo pip install --upgrade docker

在Ubuntu / Debian上,此刻有一個與軟件包升級有關的錯誤( 錯誤#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

在修復之前,請勿將其與其他backport軟件包一起安裝(如果它們已修復)

https://bitbucket.org/ambv/configparser/issues/17/importerror-when-used-with-other-backports#comment-36669436中看到:

MichałGórny

好吧,我只是想在這里報告核心問題,但是似乎其他人已經學到了困難的方法。

長話短說,您永遠無法混合使用pkg_resources命名空間和pkgutil命名空間。 在Python打包指南中對此進行了說明。 嘗試同時導入兩者可能是導致每個人隨機損壞的最佳方法。 您必須決定其中之一,並使用backports名稱空間在所有軟件包中一致地使用它。

現在,backports包似乎僅是聲明名稱空間的唯一目的,並且使用pkgutil。 所以我建議跟隨那個。

如果您從docker-compose看到此消息:

對我而言,@ CGFoX的答案無效,即使這是正確的方向。 在分析問題時,我們發現dist-packages有兩個python路徑,即/usr/local/lib/python2.7/dist-packages/backports/usr/lib/python2.7/dist-packages/backports

Python試圖從/usr/local/lib/python2.7/dist-packages/backports加載模塊“ ssl_match_hostname”模塊。 但那里不存在: drwxr-sr-x 5 root staff 4096 Aug 12 07:46 ./ drwxrwsr-x 130 root staff 12288 Aug 12 07:37 ../ -rw-r--r-- 1 root staff 75 Nov 14 2018 __init__.py -rw-r--r-- 1 root staff 269 Nov 14 2018 __init__.pyc drwxr-sr-x 2 root staff 4096 Nov 14 2018 configparser/ drwxr-sr-x 2 root staff 4096 Nov 14 2018 shutil_get_terminal_size/

但是該模塊位於其他位置。

x@soumubuntu:~$ ll /usr/lib/python2.7/dist-packages/backports total 16 drwxr-xr-x 3 root root 4096 Aug 12 07:19 ./ drwxr-xr-x 78 root root 4096 Aug 12 06:51 ../ -rw-r--r-- 1 root root 0 Aug 9 03:05 __init__.py -rw-r--r-- 1 root root 141 Aug 12 07:19 __init__.pyc drwxr-xr-x 2 root root 4096 Aug 12 07:19 ssl_match_hostname/

因此,我從B-> A復制了它:

sudo cp -r /usr/lib/python2.7/dist-packages/backports/ssl_match_hostname/ /usr/local/lib/python2.7/dist-packages/backports/

瞧,docker compose現在正在工作。

由於存在不同版本的Docker-compose和Docker,因此可能存在該問題。 首先比較版本並對其進行升級以使其兼容。

其次,您可以卸載Backport軟件包(通過pip)。

sudo pip uninstall backports.ssl-match-hostname

然后以ubuntu軟件包的形式再次安裝。

sudo apt-get install python-backports.ssl-match-hostname

我遇到了類似的問題,但是可以通過以下命令先進行卸載來解決-

pip卸載backports.ssl_match_hostname

成功卸載后,請使用以下命令通過以下命令安裝Docker客戶端:

pip安裝docker-py

我希望這將有助於解決此問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM