Black Formatterが使えなくなった:`dyld: Library not loaded: /usr/local/opt/...`
これは何?
本記事では、Apple Silicon Mac環境でHomebrewをIntel版からARM版へ移行した際に、VSCode上でPythonの依存ライブラリが正しく参照できずエラーが発生した問題と、その解決方法を紹介します。
対象読者は、VSCodeでPython仮想環境(venv)を利用している方で、同様の環境移行に直面した方を想定しています。
問題が発生した状況
Intel版のHomebrewからARM版へ移行後、VSCodeで既存のPython仮想環境(venv)を使って開発を続けたところ、PythonフォーマッターのBlack Formatter (ms-python.black-formatter
)という拡張機能で「Pythonが依存するライブラリが指定のパス/usr/local/opt/
で見つからない」というエラーが発生しました。
具体的には以下のような内容です。
dyld: Library not loaded: /usr/local/opt/gettext/lib/libintl.8.dylib
この仮想環境は移行前に作成したもので、VSCode上のPython拡張機能が古いパス/usr/local/opt/
のgettext
パッケージを参照してしまっています。
エラーの原因
ずばり、venv内のPython実行ファイルに埋め込まれたライブラリ参照パスが、Intel版Homebrewディレクトリ/usr/local/opt/
のまま残っていたためです。
ARM版Homebrewへの移行後にも、古いパスのPython実行ファイルがそのまま利用され、VSCodeのPython拡張機能が依存ライブラリを見つけられなくなっていたようです。
解決策
解決するには、venv内のPython実行ファイルを新しいARM版Homebrewのパスを利用するように設定し直します。
つまり、ARM版HomebrewでインストールしたPythonでvenv仮想環境を作成し直します。
ARM版HomebrewでPythonをインストールし直す理由
Pythonをインストールするタイミングで、一緒にインストールされる依存ライブラリのパスがPython実行ファイルに埋め込まれてしまうためです(そうらしい)。
依存ライブラリのパスが実行ファイルにハードコードされるようなので、新たな環境/opt/homebrew/bin/
でインストールし直すのが手っ取り早そうです。
- 古い仮想環境を削除する(pip freezeしたり、追加定義したものがあれば退避)
- ARM版Homebrewでインストールした新しいPythonのパスを環境変数に登録する
実行ファイルのパスが正しいか確認も忘れずに
$ which python3
-> /opt/homebrew/bin/...
- 新しいvenv仮想環境を作成する
$ cd path/to/the-project
$ python3 -m venv .venv
- 仮想環境を有効化する
$ . .venv/bin/active
まとめ
以上の手順で、Black Formatter拡張のエラーは解消できました。
最初エラーログを見た時はライブラリのエラーかと思いましたが、よく調べるとHomebrewの環境移行に伴った問題でしたね。
まだ/usr/local/opt/
にパッケージが残っているので、同様のエラーに遭遇した時には今回の知見を活用しようと思います。
Discussion