M1 MacでODriveを動かすには


エラー内容

新しく買ったM1チップMacbook Pro上でODriveを使おうと,ODrive Documentation:Getting Startedに従って

$ odrivetool

として起動しようとすると以下のようにエラーが出ました.
従来のIntelチップ版ではこのエラーは出ないですし,その解決方法を調べてもほとんど出てこないので,今回試した解決過程を記しておきます.

環境

  • Apple M1 chip Macbook Pro
  • macOS Big Sur 11.2.3

解決法

問題は,odrivetoolを立ち上げる中身でpyusbというライブラリを使用しているのですが,そのときに使用されるlibusbというパッケージが上手く見つけられていないということらしいです.
libusbはHomebrewによって以下のようにインストールするようにドキュメントに書かれているのですが,M1チップとIntelチップではHomebrewのパスが異なる1ので,おそらくこの違いのせいでpyusbから上手く見つけられていないのではないかと思います.

$ brew install libusb

Homebrew経由でインストールしたPythonを使う

Pythonのインストールには様々な方法がありこのサイトによくまとまっています.
Python環境作りのベストプラクティスが何かは分かりませんが,個人的にはpyenv+venvでプロジェクトごとに環境を作っていました.
しかしあくまで推測ですが,今回の問題はHomebrewのパッケージを上手く使えていないということなので,Homebrew経由で,/opt/homebrew以下にインストールしたPythonを使うという方針で行きます.そのPythonなら,opt/homebrew/opt/libusbを見つけられるのではないかという希望を込めて.
このissueにもそのように書かれているので,おそらくはできるのだと思います.

インストールは,以下のコマンドを叩いて最新のPython3.9をインストールすれば良いです.

$ brew install python

ODriveのインストールページには,

As of Oct 2020, Matplotlib (required by odrivetool) had not been updated to work with 3.9, so please use 3.8.6.

と書いてあるので,brew install [email protected]としてPython3.8を指定してインストールした方がいいのかもしれないのですが,そうすると逆にM1チップではnumpyのビルドに失敗します.(4/11/2021現時点でMatplotlibは動くので問題ないでしょう このissueで大丈夫だと答えてもらったので問題ないでしょう)

現在のシェルでこのpythonを使うためにはパスを通す必要があります.
pyenvと同じ感じでディレクトリに入ったときにpythonを切り替えられれば理想ですが,それを模して,以下のようなシェルスクリプトを作っておけば便利でしょう.

setup.sh
# use python3.9 installed from homebrew
export PATH=/opt/homebrew/opt/[email protected]/libexec/bin:$PATH

これを実行することで,さっきインストールしたPython3.9が使えるようになります.

$ . ./setup.sh
$ which python
/opt/homebrew/opt/[email protected]/libexec/bin/python
$ python --version
Python 3.9.4

参考サイト

venvにpipでODriveをインストール

あとは公式ドキュメントの通り進めていくだけです.venvを作って,pipでODriveをインストールしましょう.

$ python -m venv .venv
$ source .venv/bin/activate
(.venv)$ pip install --upgrade odrive

すると,先程のエラーはなくodrivetoolを起動することができました!

[Troubleshooting] IPythonのパスが間違っている

たまに,先ほどのエラーとは別に,以下のようなWarningが出ることがあります.

これは,odriveの中身で起動させるIPythonが,venvの中のものと別のものを起動させてしまっているというWarningです.
試しに

$ which odrivetool
/opt/homebrew/bin/odrivetool

として調べてみると,venvの中でpipで入れたodriveを差しておらず,別の場所にある(おそらく色々といじっているときに入れたであろうhomebrew以下の)odriveを叩いてしまったがために,その中身で起動するIPythonもvenv外のものになってしまっています.
これを,venvをactivateしている状態で起動してしまったので,上のようなWarningが出ているのではないかと思います.

これを解消するには,以下のようにrehashコマンドを打ってコマンドを登録し直しましょう.

$ rehash

そうすると,venv内のodriveが叩かれるようになり,正しく起動するようになります.

参考サイト


  1. M1チップでは/opt/homebrew以下に,Intelチップでは/usr/localにインストールされます.(参考