追記:この記事によくアクセスしてもらっているようですが、勘違いから変なやり方をしたと今では思っているので、以下を参考にしてください。
JuliaでPythonのパッケージが必要なときに - 留学・音ゲー・研究備忘録
JuliaでPythonのモジュールを使いたいことがある。これはPythonのモジュールが充実してて、Juliaのパッケージにはまだないような洗練されたNonlinear Optimization Solverがある、などである。
さて、問題は、そのPythonのモジュールをシェルから起動できるPythonに対してインストールしても、Julia上で呼び出せないことにある。何故か?それはPyCallをJuliaにインストールした際に、Juliaが独自のPythonを所有してそれを使っているからだ(MacやWindowsの場合は確実に。Linux系はよくわからん)。
つまりシェルから起動するPythonと、Julia経由で使うPythonは違う。
そこで別にCondaとか使ってPythonパッケージがJulia用Pythonへインストールできるのならいいのだが、今回使ったDFO-LSというモジュールがCondaで直接インスコできないものだからまあ面倒くさい。
結局解決策として、
1.JuliaがPyCallで呼び出すPythonをシェルから起動するPythonに統一
2.シェルから起動できるPythonにDFO-LSをインスコ
というステップをとった。
1.
PyCallで呼び出すPythonの変更は、Julia上で
ENV["PYTHON"] = "/PATH/"
と変えて、パッケージモードで ”build PyCall”を行い、Julia再起動。ここで注意したいのが、/PATH/部分で、要はここはシェルから起動させるときに使っているものと統一させる。
ここは今日やっと理解したのだが、シェルに直接JuliaとかPython3とかって打って起動させるのはたいてい/Usr/bin/や/bin/、/Usr/local/bin/ あたりにそれがコマンドとして定義されているかららしい。
つまり、いつもシェルからPython3.7と打って起動している場合は、そのPython3.7がどこで定義されているかを探して(今回はUsr/local/binだった)、そのパスを/PATH/に代入すれば良い。
なお、それを探すにはシェルでls /Usr/とかやれば見れる(ここらへんまじ素人)
もしJuliaのPyCallの中のPythonと自分がインストールしたPythonのバージョンが違うなら、Julia再起動後に
using PyCall
PyCall.pyversion
でバージョンチェックできるので、そこでわかる。同じだったらわからん。
2.
PythonのモジュールがマイナーでCondaかAnacondaかよくわからんがそのリストの中になく、
PackagesNotFoundError: The following packages are not available from current channels:
とか出てくる場合。今回のDFO-LSはGitHub上にしかなかったっぽい。(書きながら気づいたけどChannnel追加とかで対応できたのかな…でもAnaconda Cloudで検索したけどなかった。)
そこでpipという管理ソフト?を使ってインストール。今回Python3.7を上記の方法でJuliaに使わせており、シェルのコマンドもPython3.7だったので、シェルで
Python3.7 pip -m install HOGE
でインストール。HOGEはもちろん入れたいモジュールの名前。
Juliaで使うPythonの種類を変える
PyCallで利用するPythonのパスを変えたい : mwSoft blog
2個めのリンクのCondaの変更についてはあんま良くわかっておらん(今回必要なさそうだった)
非Conda系モジュールのインストール
Anaconda 環境に独自にモジュールを追加する - datalove’s diary
各々別々の説明はあるのだが、非Conda系ゆえpipなどを使わなければならず、よってデフォのPyCall紐付きPythonが使えないとかいう特殊な状況だったので。