不具合対策の備忘録です
概要
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等のパッケージマネージャで依存関係を解消できるかもしれないですが、未検証です)