pipenv install で AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'? が出た → まずは pipenv の python バージョンを確認

Django Python
2024-03-24 13:53 (8週間前) ytyng

Python3.12 環境を構築するため、Pipenv で仮想環境を新しく構築している際、pipenv install をした時に下記のエラーが出た。

Traceback (most recent call last):
  File "<my-env>/.venv/bin/pip", line 5, in <module>
    from pip._internal.cli.main import main
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/main.py", line 9, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py", line 10, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py", line 8, in <module>
    from pip._internal.cli import cmdoptions
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py", line 23, in <module>
    from pip._internal.cli.parser import ConfigOptionParser
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py", line 12, in <module>
    from pip._internal.configuration import Configuration, ConfigurationError
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/configuration.py", line 20, in <module>
    from pip._internal.exceptions import (
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/exceptions.py", line 7, in <module>
    from pip._vendor.pkg_resources import Distribution
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2164, in <module>
    register_finder(pkgutil.ImpImporter, find_on_path)
                    ^^^^^^^^^^^^^^^^^^^
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

この場合、おそらく

% python3 -m ensurepip --upgrade

をすれば解決する。システムグローバルの python 環境と仮想環境内で両方やっておいたほうが良い。

ただ、そもそも pipenv の環境がおかしかったので pipenv の作り直しをした。

システム環境の確認

python3 のデフォルトバージョンの確認 (Mac)

仮想環境(venv)に入っていない状態で

% which python3
/opt/homebrew/bin/python3

% python3 --version
Python 3.11.6

/opt/homebrew/bin/python3 が使われ、 python3.11 だった。

pipenv の使用する python のバージョンの確認

仮想環境(venv)に入っていない状態で

% which pipenv
/opt/homebrew/bin/pipenv

% head /opt/homebrew/bin/pipenv
#!/opt/homebrew/opt/python@3.9/bin/python3.9
# -*- coding: utf-8 -*-
import re
import sys
from pipenv import cli
...

pipenv は python3.9 を使うようになっていた。

pipen が使う python3 と、デフォルトの python バージョンが違っていて面倒が発生しそうなのでで、pipenv でデフォルトの python3.11 を使うようにする。

システムグローバルの pipenv の再インストール

homebrew でアンインストールしてみる

% brew uninstall pipenv
Error: No such keg: /opt/homebrew/Cellar/pipenv

homebrew でインストールされてるものではなかった

ファイルを消す

おそらく、python3.9 の pip でインストールされていると考えられる。

後から考えれば、

% /opt/homebrew/opt/python@3.9/bin/python3.9 -m pip uninstall pipenv

するときれいにアンインストールできたのかもしれないが、どうせこの後 Python3.11 環境で作り直されると思ったので、雑に rm した。

% rm /opt/homebrew/bin/pipenv

システムグローバル環境のデフォルトのpython3 で pipenv をインストールしなおす

% python3 -m pip install pipenv

インストール結果の確認

% which pipenv
/opt/homebrew/bin/pipenv

さきほど削除したファイルが再生成されている。期待通り。

% head /opt/homebrew/bin/pipenv
#!/opt/homebrew/opt/python@3.11/bin/python3.11
# -*- coding: utf-8 -*-
import re
import sys
from pipenv import cli
...

python3.11 を使うようになっていた。期待通り。

念の為 システムグローバルの python 環境で ensurepip upgrade しておく

% python3 -m ensurepip --upgrade

仮想環境の構築

python3.12 環境の pipenv 環境構築の覚書

Pipflie

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]


[requires]
python_version = "3.12"

このファイルを作ってから

% python3 -m pipenv install

head $(which pipenv) の1行目(shebang)が which python3 の結果の python のパスと一致している限り、

% pipenv install

でも同じ。

仮想環境内に入る

% python3 -m pipenv shell

仮想環境内での pip のテスト

仮想環境内で、

python3 -m pip freeze

とか

pip freeze

をしてみて、エラーが出ないかを確認する。

もし、

  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py", line 8, in <module>
    from pip._internal.cli import cmdoptions
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py", line 23, in <module>
    from pip._internal.cli.parser import ConfigOptionParser
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py", line 12, in <module>
    from pip._internal.configuration import Configuration, ConfigurationError
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/configuration.py", line 20, in <module>
    from pip._internal.exceptions import (
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_internal/exceptions.py", line 7, in <module>
    from pip._vendor.pkg_resources import Distribution
  File "<my-env>/.venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2164, in <module>
    register_finder(pkgutil.ImpImporter, find_on_path)
                    ^^^^^^^^^^^^^^^^^^^
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

このエラーが出るなら、仮想環境に入っている状態で

% python3 -m ensurepip --upgrade

をしてみる。

Currently unrated

Comments

Archive

2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011