No module named 'urllib3.packages.six' エラー対応

10 min read読了の目安(約9100字 1

根本原因が判明したので追記しています。Ansible Towerの本来の使用方法とは誤った内容ですが、一般的なPythonのトラブル情報として参考にしてください

Pythonの実行時にNo module named 'urllib3.packages.six'のエラーが出たため、原因確認と対応を行った。

環境

  • OS:Red Hat Enterprise Linux 8.3
    • サーバーGUIで標準インストール
    • dnf updateで最新の状態までアップデート済み
  • 導入したパッケージ:
    • Ansible Tower v.3.8.1
    • VMware vSphere Automation SDK for Python

原因

使用したバージョンのAnsible TowerにはVMwareモジュールは導入済みで下記手順は不要です。ただし、接続先のvSphereのバージョンによっては接続できずバージョンアップが必要な場合があります。その際は、指定されたvenvにてインストールを行ってください

VMware vSphere Automation SDK for Pythonを手順に従ってインストールした後に発生。

https://github.com/vmware/vsphere-automation-sdk-python
手順通りにインストール
# pip install --upgrade pip setuptools
# pip install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git

上記の手順ではシステムワイドにインストールを行うことになります。これにより、Ansible Towerのインストールにより構築されていたPythonの環境が壊れたのが原因です。

対処方法(クイック内容版)

pipsixをアンインストールし、dnf reinstallpython3-sixを再インストール

# python3 -m pip uninstall six
# dnf reinstall python3-six

エラー内容と対処(詳細版)

エラー発生時の関連パッケージバージョン

rpmリスト
# rpm -qa|grep -e python3-six -e python3-urllib3
python3-six-1.11.0-8.el8.noarch
python3-urllib3-1.24.2-4.el8.noarch
pipリスト
# python3 -m pip list -v |grep -e six -e urllib3
six                                1.15.0             /usr/local/lib/python3.6/site-packages   pip
urllib3                            1.24.2             /usr/lib/python3.6/site-packages

エラー再現テスト

urllib3をimportするとエラーが発生

# python3
Python 3.6.8 (default, Aug 18 2020, 08:33:21)
[GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/site-packages/urllib3/__init__.py", line 8, in <module>
    from .connectionpool import (
  File "/usr/lib/python3.6/site-packages/urllib3/connectionpool.py", line 11, in <module>
    from .exceptions import (
  File "/usr/lib/python3.6/site-packages/urllib3/exceptions.py", line 2, in <module>
    from .packages.six.moves.http_client import (
ModuleNotFoundError: No module named 'urllib3.packages.six'
>>>

(参考)Ansible Playbook実行時のエラー

Playbook実行時のエラーログ
    "exception": "Traceback (most recent call last):\n  File \"/tmp/ansible_vmware_datacenter_payload_uzcsiq6l/ansible_vmware_datacenter_payload.zip/ansible/module_utils/vmware.py\", line 24, in <module>\n    import requests\n  File \"/usr/local/lib/python3.6/site-packages/requests/__init__.py\", line 43, in <module>\n    import urllib3\n  File \"/usr/lib/python3.6/site-packages/urllib3/__init__.py\", line 8, in <module>\n    from .connectionpool import (\n  File \"/usr/lib/python3.6/site-packages/urllib3/connectionpool.py\", line 11, in <module>\n    from .exceptions import (\n  File \"/usr/lib/python3.6/site-packages/urllib3/exceptions.py\", line 2, in <module>\n    from .packages.six.moves.http_client import (\nModuleNotFoundError: No module named 'urllib3.packages.six'\n",

対処

pipでsixをアンインストールし、dnfでpython3-sixを再インストールする。

pipでsixのアンインストール
# python3 -m pip uninstall six
Found existing installation: six 1.15.0
Uninstalling six-1.15.0:
  Would remove:
    /usr/local/lib/python3.6/site-packages/six-1.15.0.dist-info/*
    /usr/local/lib/python3.6/site-packages/six.py
Proceed (y/n)? y
  Successfully uninstalled six-1.15.0
# python3 -m pip list -v |grep -e six -e urllib3
urllib3                            1.24.2             /usr/lib/python3.6/site-packages

python3-sixの再インストールの前に確認。sixが動作していないため、dnf infoコマンドでエラー表示。コマンド結果はちゃんと表示される。

dnf infoでpython3-sixの確認
# dnf info python3-six
plugin "changelog" のロードに失敗しました: No module named 'six'
plugin "product-id" のロードに失敗しました: No module named 'six'
plugin "subscription-manager" のロードに失敗しました: No module named 'six'
plugin "upload-profile" のロードに失敗しました: No module named 'six'
メタデータの期限切れの最終確認: 0:16:38 時間前の 2021年03月17日 15時22分34秒 に実施しました。
インストール済みパッケージ
名前         : python3-six
バージョン   : 1.11.0
リリース     : 8.el8
Arch         : noarch
サイズ       : 98 k
ソース       : python-six-1.11.0-8.el8.src.rpm
リポジトリー : @System
repo から    : anaconda
概要         : Python 2 and 3 compatibility utilities
URL          : https://pypi.python.org/pypi/six
ライセンス   : MIT
説明         : python-six provides simple utilities for wrapping over differences between
             : Python 2 and Python 3.
             : Python 3 version.

dnf reinstallpython3-sixを再インストール

python3-sixの再インストール
# dnf reinstall python3-six
plugin "changelog" のロードに失敗しました: No module named 'six'
plugin "product-id" のロードに失敗しました: No module named 'six'
plugin "subscription-manager" のロードに失敗しました: No module named 'six'
plugin "upload-profile" のロードに失敗しました: No module named 'six'
メタデータの期限切れの最終確認: 0:18:36 時間前の 2021年03月17日 15時22分34秒 に実施しました。
依存関係が解決しました。
============================================================================================================================================================================================================
 パッケージ                                   アーキテクチャー                        バージョン                                       リポジトリー                                                   サイズ
============================================================================================================================================================================================================
再インストール:
 python3-six                                  noarch                                  1.11.0-8.el8                                     rhel-8-for-x86_64-baseos-rpms                                   38 k

トランザクションの概要
============================================================================================================================================================================================================

ダウンロードサイズの合計: 38 k
インストール済みのサイズ: 98 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
python3-six-1.11.0-8.el8.noarch.rpm                                                                                                                                          80 kB/s |  38 kB     00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                                                         80 kB/s |  38 kB     00:00
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                                                                    1/1
  再インストール   : python3-six-1.11.0-8.el8.noarch                                                                                                                                                    1/2
  整理             : python3-six-1.11.0-8.el8.noarch                                                                                                                                                    2/2
  scriptletの実行中: python3-six-1.11.0-8.el8.noarch                                                                                                                                                    2/2
  検証             : python3-six-1.11.0-8.el8.noarch                                                                                                                                                    1/2
  検証             : python3-six-1.11.0-8.el8.noarch                                                                                                                                                    2/2

再インストール済み:
  python3-six-1.11.0-8.el8.noarch

完了しました!

再インストール後はdnfコマンドもエラーなく実行可能

dnf infoでpython3-sixの確認
# dnf info python3-six
Updating Subscription Management repositories.
メタデータの期限切れの最終確認: 0:19:51 時間前の 2021年03月17日 15時22分34秒 に実施しました。
インストール済みパッケージ
名前         : python3-six
バージョン   : 1.11.0
リリース     : 8.el8
Arch         : noarch
サイズ       : 98 k
ソース       : python-six-1.11.0-8.el8.src.rpm
リポジトリー : @System
repo から    : rhel-8-for-x86_64-baseos-rpms
概要         : Python 2 and 3 compatibility utilities
URL          : https://pypi.python.org/pypi/six
ライセンス   : MIT
説明         : python-six provides simple utilities for wrapping over differences between
             : Python 2 and Python 3.
             : Python 3 version.

対処後パッケージバージョン

pipの方のsixのバージョンが1.11.0に変更されていることが確認できる

rpmとpipでパッケージの確認
# rpm -qa|grep -e python3-six -e python3-urllib3
python3-six-1.11.0-8.el8.noarch
python3-urllib3-1.24.2-4.el8.noarch
# python3 -m pip list -v |grep -e six -e urllib3
six                                1.11.0             /usr/lib/python3.6/site-packages         pip
urllib3                            1.24.2             /usr/lib/python3.6/site-packages

参考リンク

https://github.com/urllib3/urllib3/issues/1518

https://askbot.fedoraproject.org/en/question/111697/how-to-solve-broken-dnf-in-fedora-26/