少し間が開いた「勝手に回答」シリーズ。今回はJulia Error: InitError when trying to use Plots in Python via JuliaCall,Julia Discourseからの質問です。
うまくいかない原因は,おそらくJulia言語は1.10.2
であるにもかかわらず,
python用には1.10.0
がインストールされ,どちらも$HOME/.julia
の環境を共用しているから
よく分からない状況になっているのでしょう。
これは,juliaの1.10.[12]
ではPythonCall
がjulia言語側のバグでうまく動かないため,
juliacall
インストール時に用意されるJulia環境が1.10.0に強制されるためです。
そこで,pythonのvenv用にインストールされるJuliaの環境を独立させる設定をしてみます。
まず,$HOME/venv-3.11
でpythonのvenv環境を構築しているものとします。
$HOME/venv-3.11/bin/activate
にJULIA_DEPOT_PATH
関係の設定を追加します。
deactivate
内にJULIA_DEPOT_PATH
をunsetするようにして,
activate
を実行すると,JULIA_DEPOT_PATH
に$HOME/venv-3.11/julia
を設定するようにします。
# This file must be used with "source bin/activate" *from bash* # you cannot run it directly deactivate () { # reset old environment variables if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then PATH="${_OLD_VIRTUAL_PATH:-}" export PATH unset _OLD_VIRTUAL_PATH fi if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" export PYTHONHOME unset _OLD_VIRTUAL_PYTHONHOME fi # This should detect bash and zsh, which have a hash command that must # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then hash -r 2> /dev/null fi if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then PS1="${_OLD_VIRTUAL_PS1:-}" export PS1 unset _OLD_VIRTUAL_PS1 fi unset VIRTUAL_ENV unset VIRTUAL_ENV_PROMPT # Juliaの環境をリセット ------------------------------------ unset JULIA_DEPOT_PATH if [ ! "${1:-}" = "nondestructive" ] ; then # Self destruct! unset -f deactivate fi } # unset irrelevant variables deactivate nondestructive VIRTUAL_ENV="/home/ujimushi/venv-3.11" export VIRTUAL_ENV _OLD_VIRTUAL_PATH="$PATH" PATH="$VIRTUAL_ENV/bin:$PATH" export PATH # python venv用の julia 環境を設定 --------------------------------- JULIA_DEPOT_PATH=$VIRTUAL_ENV/julia export JULIA_DEPOT_PATH # unset PYTHONHOME if set # this will fail if PYTHONHOME is set to the empty string (which is bad anyway) # could use `if (set -u; : $PYTHONHOME) ;` in bash if [ -n "${PYTHONHOME:-}" ] ; then _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" unset PYTHONHOME fi if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then _OLD_VIRTUAL_PS1="${PS1:-}" PS1="(venv-3.11) ${PS1:-}" export PS1 VIRTUAL_ENV_PROMPT="(venv-3.11) " export VIRTUAL_ENV_PROMPT fi # This should detect bash and zsh, which have a hash command that must # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then hash -r 2> /dev/null fi
変更した後は
$ source ~/venv-3.11/bin/activate
で環境を有効にして,
(venv-3.11)$ pip install juliacall
でjuliacallのインストールをします。
(venv-3.11)$ python
でpythonのReplを有効にしてOSにインストールしているQtのバージョンと合わせる。 手元のubuntu 23.10のQt6のバージョンは6.4.2なので
from juliacall import Main as jl jl.seval("using Pkg") jl.seval('Pkg.add(name="Qt6Base_jll", version=v"6.4.2+3")') jl.seval('Pkg.pin(name="Qt6Base_jll", version=v"6.4.2+3")') jl.Pkg.add('Qt6Wayland_jll') # これは必要ではないかも… jl.Pkg.add('Plots')
のような感じで実行します。
QtのバージョンはOS側に何がインストールされているかで変える必要があると思います。
後はOS側aptでlibqt6*
のライブラリをインストールしておきます。
そして,
jl.seval("using Plots") jl.plot(jl.sin, gui=True)
とかで手元の環境ではタイトルバー一表示されない変な感じでグラフが表示されました。 まだ警告はまだいくつか出ますが…
pythonは詳しくないので本当にこれでいいのかは分かりませんがsavefigとかもできるのでこれでいいでしょう。
ただ,内容を読み返してみて単に python環境のJuliaでPlots.jlのパッケージをaddしてないだけ のような感じもするのだが, 本当のところは質問者も分からないといった感じかもしれない今日この頃。
追記 ubuntu 22.04 LTSの別のPCでの例
Qt6Base_jll
のバージョンはv"6.3.0+1"
Qt6Wayland_jll
はインストールしない
でうまく動きました。むしろ,23.10よりも安定している。23.10の例でもQt6Base_jll
のバージョンを下げた方が
いいかもしれない。