Julia - run を使って Julia の中から Julia を実行する方法

環境

Julia 1.1.0

Julia の中から Julia を実行する

Julia を使っていると、 Julia の中から run を使って Julia を起動したいと思うことがあると思います。 このように

run(`julia ex.jl`)

ただこの方法はすでに julia へ PATH が通っていれば良いのですが、万人が PATH を通しているわけではないので環境によっては動かないコードになってしまいます。そもそも Windows では実行ファイルの名前が julia.exe なのでそういう点でもこのコードは環境依存していて汎用性がありません。

自分しか使わないプログラムならこういう書き方でも良いですが、GitHub などに上げて他の人にも使ってもらいたい場合には適してはいません。

環境依存させずに正しく動作させるには以下のようにします。

run(`$(Base.julia_cmd()) ex.jl`)

Base.julia_cmd() とすると起動したときの Julia のコマンドがオプション付きで返ってきます。

julia> Base.julia_cmd()
`/home/goropikari/.local/julia-stable/usr/bin/julia -Cnative -J/home/goropikari/.local/julia-stable/lib/julia/sys.so --compile=yes --depwarn=yes`

Base.julia_cmd() の返り値は Cmd 型なので文字列とは違いますが、文字列同様コマンドの中で展開するときは $ で展開します。

余談

実行ファイルのある場所を知りたい場合は Sys.BINDIR、実行ファイルの名前を知りたい場合は Base.julia_exename() でわかります。

# Unix-like OS の場合
julia> Sys.BINDIR # 実行ファイルの場所を知る
"/home/goropikari/.local/julia-stable/usr/bin"

julia> Base.julia_exename() # 実行ファイルの名前
"julia"

julia> Base.julia_cmd().exec[1] # オプションがいらない場合
"/home/goropikari/.local/julia-stable/usr/bin/julia"

# Windows の場合
julia> Sys.BINDIR
"C:\\Users\\goropikari\\AppData\\Local\\Julia-1.1.0\\bin"

julia> Base.julia_exename()
"julia.exe"

julia> Base.julia_cmd().exec[1] 
"C:\\Users\\goropikari\\AppData\\Local\\Julia-1.1.0\\bin\\julia.exe"

参考