2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Julia][Python]PythonからJuliaの呼び出し

Last updated at Posted at 2025-04-16

はじめに

 データ分析や機械学習などに利用できるプログラムとして、Juliaがあると知った。
 以下3点のメリットから今後利用することがあるかもしれないので、備忘録として初歩的なことから欲しかった資料をまとめていく。
 [1]Pythonと同じようにライブラリを利用できる
 [2]実行速度がC言語よりも速い
 [3]PythonやC言語と連携することもできる

実行環境

 参考資料[1]で構築したVSCにおけるWSL2で実行している。

PythonCall / juliacall 採用の理由

 実行速度が速いJuliaによる計算処理部分の実行を想定し、PythonとJuliaを連携するためのパッケージ・ライブラリとして、PythonCall・juliacallを利用した。
 PyJuliaを利用した事例もあるが、Pyjulia実行用の環境整備に手間がかかることに加え、自分のJuliaとのバージョン差異による警告メッセージが表示され続けてしまうため、利用を控えた。Pyjuliaは過去作成されたものなので、ライブラリ自体が古いJuliaのための記載があるらしい。参考資料[2]にある公式情報でも、Python-Julia間の連携のパッケージ・ライブラリはPythonCallを推奨している。

モジュール・ライブラリ準備

Julia

Julia側でも予めインストールする必要があり、PythonCallが導入されている必要がある。

using Pkg
Pkg.add("PythonCall")

python

python==3.12.8のCondaによる仮想環境上で、以下のライブラリをインストールした。

requirements.txt
filelock==3.18.0
juliacall==0.9.24
juliapkg==0.1.16
semver==3.0.4
setuptools==75.8.0
wheel==0.45.1

検証したプログラム

構造

.juliaにある2つのプログラムについて、call.pyから呼び出す。

./
├─.julia
|  └─test.jl
|  └─test2.jl
└─.python
   └─call.py

プログラム

test.jl
function calc(x)
    y = 10
    result = x * y

    return result
end


function array()
    arr = [1,3,5]
    
    return arr
end
test2.jl
function message()
    
    message = "Hello World"

    return message
end

function dict()
    books = Dict{String, String}(
        "ハリー・ポッター" => "ファンタジー",
        "ドラえもん" => "漫画",
    )
    return books

end

call.py
from juliacall import Main as jl
import os

# Juliaに渡すための .jl ファイルの絶対パスを取得
jl_file = os.path.abspath("../julia/test.jl").replace("\\", "/")
jl_file2 = os.path.abspath("../julia/test2.jl").replace("\\", "/")

# Juliaで include
jl.seval(f'include("{jl_file}")')
jl.seval(f'include("{jl_file2}")')

# 関数呼び出し
numeric = jl.calc(5)
array = jl.array()
dictionary = jl.dict()
message = jl.message()

print(f"numeric     = {numeric}    ({type(numeric)})")
print(f"array       = {array}      ({type(array)})")
print(f"dictionary  = {dictionary} ({type(dictionary)})")
print(f"message     = {message}    ({type(message)})")

結果

image.png
PythonからJuliaを呼び出すことに成功し,以下2点が判明した。

①関数を呼び出すにあたり、名前が重複していない限りは単純に関数名を指定するだけで利用することができている。
 ※複数ファイルで関数名が重複する場合、Julia側でモジュール化する必要があるらしいが、関数名を別名にすることで避けることができるので、今回は試していない。
②jl.sevalで呼び出すJuliaファイルについて、使用する関数などの順番に依存していない。
 ※複数ファイルで同一関数がある場合、最後に呼び出したものが適用されるらしい。
③Juliaで実行した結果をPython側に取得しているが、Pythonに存在しない型の場合はJuliaの型として取得されてしまっているので、Python側で利用する際に型修正が必要。

参考資料

[1]svoboda, 『[Julia]VSCにおけるWSL2でのJulia 環境構築~サンプルコード実行まで』, https://qiita.com/svoboda/items/6a0ad624bc58a354edb3
[2]MilesCranmer, 『JuliaPy/pyjulia: python interface to julia』, https://github.com/JuliaPy/pyjulia?tab=readme-ov-file
[3]cjdoris, 『JuliaPy/PythonCall.jl』, https://github.com/JuliaPy/PythonCall.jl
[4]Rahban1, 『The Julia module PythonCall』, https://juliapy.github.io/PythonCall.jl/stable/pythoncall/#Installation
[5]Krypf(Krypf), 『【Julia】 基礎: 型』, https://qiita.com/Krypf/items/145ad24911ca51117e29#7-array-%E5%9E%8B

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?