ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

Julia Error: InitError when trying to use Plots in Python via JuliaCall [勝手に回答]

少し間が開いた「勝手に回答」シリーズ。今回はJulia Error: InitError when trying to use Plots in Python via JuliaCallJulia 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.11pythonのvenv環境を構築しているものとします。

$HOME/venv-3.11/bin/activateJULIA_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のバージョンを下げた方が いいかもしれない。