Intro
Macでインストール可能なPython1を使ってPoetryをインストールしようとすると、動的ライブラリを読み込めないとかいう以下のerror logを吐いて死ぬことがよくある。
dyld[6624]: Library not loaded: @loader_path/../../../../Python.framework/Versions/3.11/Python
Referenced from: <16376C03-0DA9-3714-9207-5AF8D546EED4> /Users/$USER/Library/Application Support/pypoetry/venv/bin/python3.11
Reason: tried: '/Users/$USER/Library/Application Support/pypoetry/venv/bin/../../../../Python.framework/Versions/3.11/Python' (no such file), '/Library/Frameworks/Python.framework/Versions/3.11/Python' (no such file), '/System/Library/Frameworks/Python.framework/Versions/3.11/Python' (no such file, not in dyld cache)
$USER
は実際にはホームディレクトリ名
特に、HomeBrewでPythonをアップデートした後はよくこの症状が出て、そのたびに調べ直していたので、備忘録としてまとめることにした。
TL; DR
- PythonはApple版でもHomeBrew版でも良い。(自分はHomeBrew版を使っている)
- Poetryのインストールには、公式のワンライナーではなく以下のワンライナーを使う。
curl -sSL https://install.python-poetry.org | sed 's/symlinks=False/symlinks=True/' | python3 -
もっと詳しく
Poetryの該当GitHub issue上でのコメントにリンクされたCPythonのGitHub issueのコメントによると、 仮想環境を作成するvenvの --copies
や --symlinks=False
オプションを使う(バイナリをコピーし、シンボリックリンクを使わない)ことで、壊れたPythonバイナリが生成されることが主な原因。この動作は、Poetryのインストールスクリプトでも行っているため、同じ問題が発生する。
「壊れたPythonバイナリ」というのは、「動的ライブラリを読み込めないバイナリ」のことだと思う。同じMac向けのPythonバイナリでも動的ライブラリへのパスの種類は異なっていて、状況は複雑っぽい。
- Apple版バイナリ: 相対パス
-
symlinks=False
にすると常に壊れる。
-
- Homebrew版バイナリ: 絶対パス
- Python 3.11.3までは、Pythonの新しいリリースにアップグレードすると壊れる。
- Python 3.11.3以降は、HomeBrewで新規インストールしても壊れる。2
- python.org版バイナリ: おそらく問題ない?
ということで、常にsymlink=True
にするのが解決策らしい。Macではvenvによる仮想環境の作成にシンボリックリンクを使うのがデフォルト動作になるだろうとの指摘がある。2
ちなみに未だに該当issueは1年以上closeしておらず、問題の複雑さを物語っているように思える。
参考文献
-
AppleがMacに同梱しているバイナリ、HomeBrewでインストール可能なバイナリ ↩
-
https://github.com/python-poetry/install.python-poetry.org/issues/24#issuecomment-1666601505 ↩ ↩2