2019年4月2日火曜日

Julia の PyCall で python ファイルを reload する

Julia の Pycall だと、pyimport で python のファイルを読み込みはできるが、python ファイルを修正しても pyimport のそのままでは読み込めない。
これを回避するには、以下のように pyimport に reload とかをつける必要がある。
(たぶん python 側の制約じゃないかと思う。)


ここでは、test_py.py の中に test1() という関数がある場合とする。

まずは、python でどれを使っているかを明示して、
ENV["PYTHON"] = "/usr/bin/python"
それから、現在のディレクトリを python の path に通す。
using PyCall
if PyVector(pyimport("sys")["path"])[1] != ""
    pushfirst!(PyVector(pyimport("sys")["path"]), "")
end

このあとは、
if @isdefined(test_py)
    test_py = pyimport("importlib")["reload"](test_py)
else
    test_py = pyimport("test_py")
end
とする。
初回は pyimport("test_py") で読み込めるが、2回目以降は読み込めないので、これを "reload" を使って再読み込みするようにしている。

このようにすれば、test_py.test1() としてモジュールの中の関数を呼び出すことができる。

0 件のコメント:

コメントを投稿