Linuxbrew×asdf構成で、Pythonの_ctypes問題を回避する
Linuxbrew×asdf構成で、Pythonの_ctypes問題を回避する
手元ではMacOSを使っているが、普段の作業は開発用に立てたEC2インスタンスの中で作業をすることが多いです。
そして、なるべく覚えるコマンドを少なくしたい、関数を使いまわしたいという思いから開発用マシンでも以下の構成にしています。
- OS:
Ubuntu 20.04
- パッケージ管理:
→apt
linuxbrew
- ランタイムバージョン管理:
→pyenv
asdf
こうすることで、手元と同じbrew
コマンド経由でライブラリをインストールすることができ、
asdf
だけでランタイムのバージョンも管理することができます。
しかし、linuxbrew
もasdf
もまだ枯れていないために環境構築でめちゃくちゃハマってしまいました。。。
今後自分と同じように苦しむ人が現れないための供養記事になります。
超要約
以下で解決するはず
$ brew install bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib
$ asdf uninstall python <version>
$ CC="$(brew --prefix gcc)/bin/gcc-11" \
> asdf install python <version>
回避するために必要な知識
- 環境が整っていないと、
_ctypes
モジュールのインストールはスキップされる- このエラーが出たときは、pythonをビルドし直す必要がある
-
asdf python plugin
は実はpyenv
のラッパー- 解決のヒントは
asdf
ではなく、pyenv
の周りに落ちている
- 解決のヒントは
-
pyenv
はインストール方法によって、推奨されている環境構築の方法が違う- その辺の記事のコピペでは、解決できない場合がある
事の発端
Remote SSHプラグイン経由でEC2インスタンスにアクセス、VSCodeのJupyterUIで分析をしようとしたら、必要なipykernel
がインストールできない。
ここでinstallをクリックしても、
installできていない...
推奨されているコマンドをターミナルで打つと、一見うまく言っているように見えるが、やっぱり駄目。。。
この無限ループ地獄に陥ってしまった。
詳しく
問題の直接的原因
上記のipykernel
がインストールできない問題の根本原因は_ctypes
モジュールがないことでした。
詳細は以下の記事が詳しいです。
【Python3】_ctypes と libffi のインストールに苦しんだ記録 – notemite.com
このエラーを解決するためには、ctypes
が依存しているlibffi
などのライブラリをインストールしてPythonのビルド環境を整えてからPythonをビルド(=インストール)し直す必要があるとのことです。
自分の場合、asdf経由でPythonをインストールしていたので以下のようにPythonをインストールし直せば大丈夫かも知れないと思い、試してみました。
(どこかの記事でpythonプラグインごとインストールしなおすとうまくいったと見たのでそうしました)
$ asdf plugin remove python
$ asdf plugin add python
$ asdf install python <バージョン>
しかし、やっぱり駄目でした。。。
更に深ぼる
pythonの再インストールで駄目ということは、ビルド環境が整っていないのかも知れないと思い、ビルド環境を調べてみました。
自分の場合、cloud-initでインスタンスを立てる際にすべてインストールするようにしていたので、それを見直しました。
すると、必要な依存関係はすべてインストールされていました。
(なんなら、linuxbrew
とapt
の両方でインストールできていました。。)
そこで、もしかしたらasdf
のバグ何じゃないのかと思いasdf
とasdf-python
のイシューを探りにいきました。
やはりそれっぽいものも見当たらなかったので次に、asdf-python
コードを見てみました。
するとどうでしょう。asdf
は内部的にpyenv
を使っていたのです!!
pyenv
周辺を探る
そこで、pyenv
を検索KWに加えて改めてググり直してみました。
すると、homebrew
を使っている場合は別の解決策が必要だというStackoverflowに行き着きました。
$ CC="$(brew --prefix gcc)/bin/gcc-11" \
$ pyenv install --verbose 3.10.0
ここで、閃きました。
もしかして、asdf
は内部的にpyenv
を使っているし、自分はapt
ではなく、linuxbrew
で環境を作っている。
ということは、これと全く同じ方法で自分も問題も解決できるのではないか?
そこで、下記コマンドを試してみました。
$ asdf uninstall python <version>
$ CC="$(brew --prefix gcc)/bin/gcc-11" \
> asdf install python <version>
すると、、、、、うまくいきました!!!!!
無事解決!!
まとめ
色んな環境の違いにより、解決策は異なってくることがよく分かった経験になりました。
便利な新しいツールを使うのは便利だけど、高度なことをやっている分エラー解決が難しくなります。
そんな時にも基礎的な部分のことを知っていればなんとか対処することができます。
やはり、基礎が大事だとわかりました。
参考
python - Python3: ImportError: No module named '_ctypes' when using Value from module multiprocessing - Stack Overflow
【Python3】_ctypes と libffi のインストールに苦しんだ記録 – notemite.com
Home · pyenv/pyenv Wiki
Discussion