MacOSでMATLABからpyenvでインストールしたPythonを呼び出す.
MATLAB から Python を呼び出すには,MATLAB 公式ドキュメント MATLAB からの Python の呼び出し や MATLAB から Python モジュールへのアクセス - 入門,Python を使用するためのシステムの構成 を参考にすることでできます.自分の環境では pyenv で Python をインストールしたため,pyenv 依存の Python を呼び出す方法について調べてまとめてみました.
環境 (2022/12/07時点)
macOS Monterey12.6.1
Python 3.8.6
pyenv 2.3.7
MATLAB 2022a
注釈
MATLAB 上にて MATLAB が参照している Python について返す関数 pyenv と,Python のインストールに利用した複数のバージョンの Python を管理するパッケージマネージャー pyenv の名称が被っているので,この記事ではパッケージマネージャーの方を Pyenv とします.
また,Pyenv および Python のインストール方法については割愛します.この記事に関係する最新の情報は,公式ドキュメントをご確認ください.
MATLABからPythonを呼び出す
Python を使用するためのシステムの構成 によると,MATLAB の pyenv 関数を使うことで MATLAB が参照する Python を設定できます.第二引数には,Python 実行可能ファイルへの絶対パス(ドキュメントの表現そのまま)を使います.
% MacやLinuxでの Pythonの設定
pyenv('Version','/Users/.../bin/python')
このとき,それぞれの MATLAB で対応している Python バージョンでないといけません.これは,Versions of Python Compatible with MATLAB Products by Release から確認できるので,エラーなどが出た場合は対応する Python をインストールし直してください.
オプション指定で Python をインストールする
また,MacOS では --enable-shared オプションを指定してインストールされた Python でないと使うことができません.
オプション指定のない Python では,Python の共有ライブラリを参照できず,print() すら実行できませんでした.
% Library が何も書かれていない...
>> py = pyenv('Version', '/Users/.../3.8.6/bin/python')
py =
PythonEnvironment のプロパティ:
Version: "3.8"
Executable: "/Users/.../3.8.6/bin/python"
Library: ""
Home: "/Users/.../3.8.6"
Status: NotLoaded
ExecutionMode: OutOfProcess
% 以下のようなエラーが出る
>> pyrun("print('Hello World')")
使い方によるエラー feval
関数または変数 'py.dict' が認識されません。
この場合,--enable-shared オプションを指定して,Python をインストールし直してください.
% Pyenv でインストールする場合
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.8.6
Pyenv でインストールした Python を呼び出す
Pyenv 経由でインストールした Python では,第二引数の絶対パスが Pyenv のセットアップで使われる "/Users/…/.pyenv/shims" だと MATLAB が参照できません.
Pyenv における環境変数 PATH
Pyenv では,Python の環境変数 PATH を "/Users/…/.pyenv/shims" に固定し,.pyenv/version ファイルにて指定したバージョンを参照することで切り替えて使うことができているようです.しかし,MATLAB から Python を呼び出す場合,この .pyenv/version を参照してないと思われるため,この PATH ではなく,それぞれのバージョンにおける実行可能ファイルを直接参照できるパスを指定する必要があるようです.
Pyenv でインストールした Python を参照する
実行可能ファイルは,.pyenv/versions/3.8.6/bin/ 下から参照できます.バージョンは適宜インストールしたものに置き換えてください.
このパスを使って MATLAB にて pyenv を実行します.すると,MATLAB が参照できるようになります.
>> py = pyenv('Version', '/Users/.../.pyenv/versions/3.8.6/bin/python')
Library に何も書かれていない場合は,先述したように共有ライブラリが参照できていないことが原因であるため,Pyenv にて --enable-shared オプションで Python をインストールし直してください.
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.8.6
これで,MATLAB から Python を呼び出すことができるようになりました.
>> pyrun(["print('Hello World')"])
Hello World
MATLAB 起動中に Pyenv にてバージョンを切り替えた場合は,MATLAB を再起動するか,"terminate(pyenv)" を1度実行した上で,pyenv を実行することで反映されます.
まとめ
この記事では,MacOS で Pyenv 経由でインストールした Python を MATLAB から呼び出すために必要なことをまとめました.確認すべきことは,以下の3点です.
MATLAB で対応している Python バージョンになっているか.
--enable-shared オプションを指定して Python をインストールしたか.
第二引数の絶対パスは,インストールした Python を参照できているか.
現在は,公式ドキュメントを読み進めながら,やれそうなことを探っています.まずは,自分で Python で実装したスクリプトを実行できるようにしたいなと思っています.
今回は,以上です.お読みいただきありがとうございました.