🏞️

Juliaから仮想環境Pythonを利用する in VSCode

2024/04/05に公開

はじめに - Juliaとは

こんにちは。株式会社アイデミーでデータサイエンティストをしております中沢(X/Bsky)です。

皆さんはJuliaというプログラミング言語をご存知でしょうか。Juliaは数値計算やデータ分析を志向した言語であり、Pythonのように簡単に書くことができ、Cのように高速に動作するものを目指した『欲張り』な言語として注目を集めています[1]。しかも、PyCallやPyPlotといったパッケージを通じてPythonのライブラリやツールをJuliaのコード内で直接利用できるため、Pythonの広範なエコシステムを高速なJulia環境で活用することができます[2]。加えて、Jupyterに対応しており、Notebook形式で分析を進めることも可能です[3]

しかし、Pythonとの連携を考えると悩みのタネとなるのが、Pythonの環境ややこしい問題です。変なものを入れてコアPythonが動かなくなっても困りますし、Juliaで使うPythonパッケージを明示的にまとめて管理できると嬉しいですよね。そこで本稿では、仮想環境内のPythonと連携したJuliaをVSCodeのJupyter Notebook上で動かす環境を作る方法をご紹介します。

手順0: Julia, Python, VSCodeのインストール

それぞれ必要なバージョンをインストールしてください。

手順1: Python仮想環境の構築

みなさんが普段から使っておられる方法でJuliaとの連携用のPython仮想環境を構築してください[4]。例えば、

  • venvを使う場合 python -m venv env4julia
  • condaを使う場合 conda create --name env4julia python=3.10

などが挙げられます。

手順2: Pythonの使いたいパッケージをインストール

先ほど作成した仮想環境をactivateします。例えば、

  • venvの場合は
    • (Mac/Linux) source env4julia/bin/activate
    • (Win) env4julia/Scripts/activate
  • condaの場合は conda activate env4julia

などですね。

その後、pip install numpy pandas matplotlib などを実行し、必要なPythonパッケージをインストールします。

手順3: 仮想環境Pythonのパスを取得

仮想環境がactiveな状態で、ターミナルで python -c "import sys; print(sys.executable)" を実行し、仮想環境のパスを取得してください。これを手順7で使うので、どこかに記録しておいてください。
ここでは仮に /path/to/env4julia/bin/python が得られたとしましょう。

手順4: Juliaのプロジェクト作成

Juliaではプロジェクトという形式で、仮想環境のようなものを構築します。以下の手順でプロジェクトを作成します。

  • ターミナルで作業ディレクトリに移動
  • juliaと入力し、Juliaを起動[5]
  • Juliaが起動したら ] を押してパッケージモード (pkg>と表示される)に入る
    • ]deleteでパッケージモードの出入りができる
      Image from Gyazo
  • pkg> activate .と入力することで現在の作業ディレクトリをプロジェクト名としたプロジェクトが起動される
    Image from Gyazo
  • pkg> statusと入力すると、Status [作業ディレクトリ]/Project.toml (empty project)と表示されることを確認

手順5: Juliaパッケージのインストール

Juliaのパッケージモードに入ったまま、以下のように必要なパッケージをインストールします。

  • pkg> add PyCall ... JuliaからPythonを呼び出すためのパッケージをインストール
  • pkg> add IJulia ... JupyterでJuliaを使うためのパッケージをインストール

パッケージをインストールすると、作業ディレクトリにProject.tomlManifest.tomlの2ファイルが作成されます。これらがJuliaの環境を定義しています。

パッケージインストール後、pkg> statusと入力すると、インストールされたパッケージ一覧が確認できます。

Image from Gyazo
(↑は本稿で触れていないものも入っていますがご容赦ください)

手順6: Juliaから仮想環境Pythonへのパスを通す

まず、deleteを押してパッケージモードを終了します。
そして、手順4で記録したPythonのパスをJuliaに教えてあげます[6]

julia> ENV["PYTHON"] = "/path/to/env4julia/bin/python"

そしてPyCallを再ビルドします。]を押して再度パッケージモードへ入り、pkg> build PyCall を実行します[7]

手順7: VSCodeの環境構築

  • VSCodeを起動
  • 拡張機能をインストール
    Image from Gyazo
  • 作業ディレクトリを開き、ファイル (.ipynb) を作成
  • Jupyter NotebookのカーネルでJuliaが選べるようになっていることを確認
  • コードテスト
    Image from Gyazo

Python呼び出しテスト

以下のコードを実行することで、指定した仮想環境のPythonが選択されていることを確認します[8]

using PyCall
println(PyCall.python)

次は実際にJuliaからPythonのパッケージを呼び出してみましょう。今回はnumpyとpandasをインストールしていますので、以下のコードでテストしてみます。

using PyCall

# NumPyとPandasのインポート
np = pyimport("numpy")
pd = pyimport("pandas")

# NumPyの動作確認
arr = np.array([1, 2, 3, 4, 5])
println("NumPy array: ", arr)

# Pandasの動作確認
df = pd.DataFrame(Dict("A" => [1, 2, 3], "B" => [4, 5, 6]))
println("Pandas DataFrame:")
println(df)

# Python関数の呼び出し確認
math = pyimport("math")
result = math.sqrt(16)
println("Square root of 16: ", result)

# Pythonスクリプトの実行確認
pyimport("os")["system"]("python -c 'print(\"Hello from Python!\")'")

出力結果↓

NumPy array: [1, 2, 3, 4, 5]
Pandas DataFrame:
PyObject    B  A
0  4  1
1  5  2
2  6  3
Square root of 16: 4.0
Hello from Python!

これが出れば成功です!

おわりに

本稿では、JuliaとPythonの仮想環境を連携させ、VSCodeのJupyter Notebook上で動かす環境の構築方法を紹介しました。Juliaは高速性と使いやすさを兼ね備えた言語ですが、Pythonの豊富なパッケージ群を活用することで、さらに幅広い用途に適用できるようになります。

そもそもPythonをJuliaから呼び出す必要があるのか(Julia単体でも色々できる[9]し、本当に必要なときは別々に動かせばいい)という話でもあるのですが、選択肢を持っておいて悪いことはありません[10]。自身の目的に応じて最適なアプローチ選択していただければと思います。

本稿が、みなさまのJuliaとPythonを使ったデータ分析の一助となれば幸いです。

脚注
  1. Why We Created Julia https://julialang.org/blog/2012/02/why-we-created-julia/  ↩︎

  2. RともRCallを使えば連携ができます。 ↩︎

  3. Jupyter = Julia + Python + R ↩︎

  4. 既存の仮想環境と連携させたい場合は手順2,3は飛ばしてください。 ↩︎

  5. ここでJuliaが起動しない場合、Juliaのパスが通っていないと考えられます。 ↩︎

  6. Win機の場合はバックスラッシュ→スラッシュに置換する必要があるようです。 ↩︎

  7. Pythonのライブラリをアップデートした場合も再ビルドが必要になるかもしれません。未検証。 ↩︎

  8. 手順7から同じターミナルで継続して動かす場合はJuliaの再起動が必要となります。再起動後、プロジェクトのactivate (pkg> activate .)を忘れないように注意してください。 ↩︎

  9. 本稿では例としてnumpyとpandasを呼び出しましたが、Juliaだけでもデータの加工・可視化は十分に行えます。 https://zenn.dev/otwn/articles/14b90c4db5b974 ↩︎

  10. 例えばRCallとPyCallでRとPythonの間をシームレスに繋ぐのも一つのユースケースかもしれません。 ↩︎

Aidemy Tech Blog

Discussion