Pythonでの _ctype の依存関係エラー対策の備忘録 / ModuleNotFoundError: No module named _ctypes 対策

python_image

不具合対策の備忘録です

概要

pyenv/venvで構築したpython環境で、
pythonのパッケージインストール(pip等)した場合に_ctype エラー(ModuleNotFoundError: No module named _ctypes)が解消しない場合は、
pyenv uninstall で該当のPythonバージョンを消して、
pyenv install をやり直す必要がある。

具体的な例と対策手順

pyenv/venvで正常に環境構築できているPython環境でも

pip install mysqlclient
pip install requests
pip install django
pip install selenium

等でctypeの依存関係エラーが発生する場合がある。

ModuleNotFoundError: No module named _ctypes

上のエラーを解決するには、
該当のPythonバージョンを削除して、依存関係のパッケージをインストールしてから、Pythonを再インストール(rebuild)する必要がある。

※ 該当のPythonバージョンは一度アンインストールする(リビルドが必要)

※ 2022年追記:アンインストール前に現在のパッケージ一覧を保存しておくと良いです

pip freeze > require_`date "+%Y%m%d".`txt
  • pyenv で 特定のパッケージバージョンをアンインストールする例
pyenv uninstall 3.8.9
pyenv uninstall 3.8.12

※ 以下からはUbuntu前提の例です

関連するOSパッケージをインストールする

sudo apt install python3-dev build-essential default-libmysqlclient-dev
sudo apt install libncursesw5-dev libgdbm-dev libc6-dev libctypes-ocaml-dev zlib1g-dev libsqlite3-dev tk-dev 
sudo apt install libssl1.1 libssl1.1=1.1.1f-1ubuntu2 libssl-dev libmysqlclient-dev
sudo apt install librust-libsodium-sys-dev

パッケージの依存関係が分かるなら、python3-パッケージ名もインストールする。

sudo apt install python3-*

※依存関係でインストールできないパッケージが表示された場合は、パッケージを選択してインストールする

pyenvでpythonバージョンをインストール

※3.8.12をインストールする場合

pyenv install 3.8.12
pyenv local 3.8.12
pyenv global 3.8.12

pythonのパッケージを再インストールする

pip install mysqlclient
pip install requests
pip install django
pip install selenium

※ 必要であれば、保存したパッケージ一覧を再インストールする

pip install -r require_`date "+%Y%m%d".`txt

エラーが表示されなければOK.

_ctypeエラーが続く場合は、もう一度Pythonをアンインストールして、必要なパッケージを入れ直してから再インストールする。

  • pyenv-winを利用している場合

_c_typeエラー等が含まれていると、WindowsではPythonをリビルドしてパッケージの依存関係を解消することが難しい。だから、WindowsではWin用のバイナリパッケージが提供されているバージョンを利用するか、WSLを利用したほうがいい。
(※pacman等のパッケージマネージャで依存関係を解消できるかもしれないですが、未検証です)