Linuxbrew(Homebrew) で入れた docker-compose で ModuleNotFoundError: No module named 'invoke' と言われたときにやること

環境

まあバージョンはあまり関係ないと思いますが。

  • Fedora 31 (WSL1)
  • Homebrew 2.5.2
  • Python 3.8.5
  • docker-compose 1.27.3

問題発生

Homebrew、Macは手元にないので Linuxbrew ですけど、で入れた docker-compose で次のエラーがでました。

ModuleNotFoundError: No module named 'invoke'

これは ~/.ssh/config の Match で exec が使用されていると発生します。

原因

paramiko でいくつかの依存パッケージがオプショナルになっており Match exec を使うためには invoke が必要なためです。

Linuxbrew で pyinvoke を入れれば大丈夫なのかと思ったのですが、ダメでした。

brew install pyinvoke

Python のことはよくわからないですが、それぞれ別の virtualenv だから、とかなのでしょうか。たぶん。

解決

docker-compose をインストールしたときに依存で入った python3 の pip3 で invoke をインストールすれば大丈夫です。

念のため python3 や pip3 が Linuxbrew のものになっているか確認します。

which python3 pip3

もしこれが /usr/bin/python3/usr/bin/pip3 になるなら invoke のインストールための pip コマンドは絶対パスで指定すると良いでしょう。

/home/linuxbrew/.linuxbrew/bin/pip3 install invoke

さいごに

~/.ssh/config で Match の exec とか使う人あまりいないのでしょうか。。。ちなみに Github の Releases からバイナリをダウンロードしたときは発生しません。これは pyinstaller というものでワンバイナリになっているようなのですが、何が違うんでしょう? 謎。