Juliaの勉強中。これまでPyCall.jl
+matplotlib
で作図していたが、今回PythonCall.jl
+matplotlib
の利用を試み、その環境管理の方法をまとめる。
結論、既存condaで管理しているenvsをそのまま利用することは自分にはできなかったが、既存condaのconda
コマンドを利用してパッケージ管理をする方法にたどり着いた。
公式フォーラムでは、新たに導入するのであればPythonCall.jlをお勧めする、と言っている人がいる。
環境
- Intel iMac, macOS Sequoia 15.0.1
- conda 23.11.0
- julia 1.11.1
0. juliaのアンインストール
juliaup
の利用を想定。
環境変数の情報が内部に残るみたいで、ゼロから構築する方が確実だった。.julia
も確実に削除、パスは要確認。
juliaup self uninstall
rm ~/.julia
1. juliaのインストール
公式を参照。
curl -fsSL https://install.julialang.org | sh
カスタマイズは多分で任意で大丈夫(今回はデフォルト)。
2. 環境変数の設定
多分ここが大事、最初に設定することが大事、多分。
export JULIA_CONDAPKG_EXE=path/to/ana(mini)conda/bin/conda
export JULIA_CONDAPKG_BACKEND=""
export JULIA_CONDAPKG_ENV=""
一つ目のexport
は使いたいconda
コマンドへのパス1。
二つ目と三つ目のexport
は絶対に設定してはいけないという戒めから明示的に空2。実行の必要はない、多分。
PyCall.jl
は既存のconda環境をそのまま流用できたが、PythonCall.jl
は既存のconda環境を使おうとするとshellにkillされてしまう(自分だけ?)。
試しにJULIA_CONDAPKG_ENV
に既存conda環境のパス(envs以下)を指定し、PythonCall.jl
が問題なく使えるなら解決、以下は不要。失敗したら0.juliaのアンインストール
からやり直し。
3. CondaPkg.jlのインストール
julia REPLを起動、Pkgモード (])へ入り、まずCondaPkg.jl
3をインストールする。
julia
pkg> add CondaPkg
ここでJULIA_CONDAPKG_EXE
のコマンドが利用される。環境変数がリフレッシュされた場合はデフォのmambaが動き出す。それが嫌なので毎回export
必須。初回で必要なパッケージを揃えてしまうのがよろしい。
必要なパッケージをインストール。
pkg> conda add matplotlib cartopy
4. PythonCall.jlのインストール
pkg> add PythonCall
あとはPyCall.jl
と同様に使える。
julia> using PythonCall
julia> plt=pyimport("matplotlib.pyplot")
julia> ccrs=pyimport("cartopy.crs")
一応バージョンを確認する。
julia> m=pyimport("matplotlib")
julia> m.__version__
Python: '3.9.2'
julia> c=pyimport("cartopy")
julia> c.__version__
Python: '0.24.0'
成功🎉
なお、自分は作図で満足につき、他パッケージは未検証。
あとがき
新環境の構築が必要だが、buildが無い分PyCall.py
よりある意味楽ちんかも。
参考
PythonCall & JuliaCall - Guide
-
デフォルトだとmabma(minimamba)でパッケージ管理がなされるが、これは最新バージョンの追従が遅いので、例えば
cartopy
をインストールするとpyhton3.9
、matplotlib1.x
へダウングレードされてしまって涙。 ↩ -
ENVの方へ
CONDA_JL_HOME
よろしく既存conda環境のパスを指定しconda add
したら、その環境を改変し始めた。。(途中エラーで改変されることはなかったが) ↩ -
PythonCall.jl
はCondaPkg.jl
を利用しPyCall.jl
はConda.jl
を利用するがCondaPkg.jl
はConda.jl
と独立である一方PythonCall.jl
はPyCall.jl
のconda環境を利用することができるらしい(WT*?!💢)。類似名の乱立はGPTの混乱をもたらしそうでNG。 ↩