WindowsでJuliaをJupyterから使う

2017-06-15

黒木 玄


以下は6月15日の後半の作業。

前半とは別のWindows機にJuliaとAnaconda3を入れた。

2周目なので比較的短時間に手際よくインストールできた。

  1. 次のように環境変数を設定した。

    JULIA_HOME=C:\Julia-0.5.2\bin
    JULIA_PKGDIR=C:\Julia-0.5.2\Pkg
    

    おそらく JULIA_PKGDIR の指定が本質的である。これをサボると Jupyter Notebook で Julia のノートブックを作成したときに dead kernel の永久ループで苦しむ。

  2. Julia 0.5.2 を C:\Julia-0.5.2 以下にインストール。

    https://julialang.org/downloads/

  3. Anaconda 3.6 version を C:\Anaconda3 以下にインストール。

    https://www.continuum.io/downloads

  4. Julia を起動して以下を実行。

    Pkg.init()
    Pkg.add("IJulia")
    ENV["PYTHON"]="C:\\Anaconda3\\python.exe"
    Pkg.add("PyPlot")
    using PyCall
    PyCall.pyversion
    

    最後に v"3.6.1" と表示された。Anaconda3 の python を使う設定になっている。

  5. スタートメニューの Anaconda3 の Jupyter Notebook のショートカットをデスクトップに送ってコピーし、 プロパティを参照し、リンク先の最後の %USERPROFILE% を自分好みの初期フォルダに変更する。私は次のように変更した。

    C:\Anaconda3\python.exe C:\Anaconda3\cwp.py C:\Anaconda3 "C:/Anaconda3/python.exe" "C:/Anaconda3/Scripts/jupyter-notebook-script.py" C:\home\kuroki\Dropbox\Jupyter

    これでデスクトップ上の Jupyter Notebook のショートカットをダブルクリックすると、自分好みのフォルダを初期フォルダにして、Jupyter Notebook が起動し、ブラウザにその画面が現われる。

    ブラウザのその画面で、New → Jupyter 0.5.2 を選択すると、Jupyter 0.5.2 の notebook を使用可能である。

  6. Juliaを起動してさらに以下を実行して、使えるパッケージを増やした。

    Pkg.add("ODE")
    Pkg.add("SymPy")
    Pkg.add("Gadfly")
    Pkg.add("Compose")
    Pkg.add("DifferentialEquations")
    Pkg.add("Plots")
    Pkg.add("DataFrames")
    

    以下も便利

    Pkg.status()
    Pkg.update()
    Pkg.build("~")
    Pkg.test("~")
    
  7. C:\Anaconda3\Scripts にパスを通し、condaを楽に使えるようにして色々入れた。

    conda install -y -c conda-forge jupyter_contrib_nbextensions
    conda install -c conda-forge pymc3
    

以下は6月15日の前半の作業。

試行錯誤で手間取った様子の記録をすべて残しておく。

https://lectures.quantecon.org/jl/getting_started.html におおむね従って、古いWindows 7機にJuliaとAnacondaをインストール

ポイントはJuliaをインストールした直後に環境変数

JULIA_PKGDIR

を設定しておくことだと思われる。Juliaの環境変数に関しては

http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/install/

を参考にした。

環境変数を適切に設定しておかないと、IJuliaをインストールしているにも関わらず、 それを発見できずにDead kernelになって、Jupyter NotebookからJuliaを使用できなくなるようだ。

あと、スタートメニューから起動できる Jupyter Notebook のショートカットの リンク先が正常に作成されていないので、手で修正することが必要である。

やはり、Windowsで色々やるのは大変であった。

試行錯誤の詳しい経緯は以下の通り。 上から下へ時系列順なので答えを先に知りたい人は下の方から読んだ方がよいかもしれない。

Juliaのインストール

https://julialang.org/downloads/

から

Windows Self-Extracting Archive(Ver.0.5.2)

をダウンロードして

C:\Julia-0.5.2

以下にインストールした。

環境変数のPATHに

C:\Julia-0.5.2\bin

を追加した。(追加の仕方はググればわかるはず)

適当なコマンドラインからJuliaを実行。

私はCygwinのzshから実行したが、Windowsのコマンドプロンプトからの実行でもよいはず。

$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.5.2 (2017-05-06 16:34 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-w64-mingw32

julia> x = 10
10

julia> 2x
20

julia>

julia> f(x::Int)=(x÷100)^2+(x%100)^2
f (generic function with 1 method)

julia> @time [(x,f(x)) for x=100:9999 if f(f(x))==x]
  0.061291 seconds (42.71 k allocations: 2.011 MB)
6-element Array{Tuple{Int64,Int64},1}:
 (1233,1233)
 (3869,6205)
 (5965,7706)
 (6205,3869)
 (7706,5965)
 (8833,8833)

Anacondaのインストール

https://www.continuum.io/downloads

から

Anaconda 4.4.0
For Windows
Python 3.6 version
64-BIT INSTALLER

をダウンロード。438MBでダウンロードに10分くらいかかった。

C:\Anaconda3

以下にインストールした。2GBほどスペースを取られる。

Anaconda Cloud にも登録。

IJuliaをインストール

Juliaを起動して

Pkg.add("IJulia")

を実行した。実行途中でWarningが幾つか出た。しばらく待つ必要がある。

$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.5.2 (2017-05-06 16:34 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-w64-mingw32

julia> Pkg.add("IJulia")
INFO: Initializing package repository C:\home\kuroki\.julia\v0.5
INFO: Cloning METADATA from https://github.com/JuliaLang/METADATA.jl
INFO: Cloning cache of BinDeps from https://github.com/JuliaLang/BinDeps.jl.git
INFO: Cloning cache of BufferedStreams from https://github.com/BioJulia/BufferedStreams.jl.git
INFO: Cloning cache of Compat from https://github.com/JuliaLang/Compat.jl.git
INFO: Cloning cache of Conda from https://github.com/JuliaPy/Conda.jl.git
INFO: Cloning cache of IJulia from https://github.com/JuliaLang/IJulia.jl.git
INFO: Cloning cache of JSON from https://github.com/JuliaIO/JSON.jl.git
INFO: Cloning cache of LibExpat from https://github.com/JuliaIO/LibExpat.jl.git
INFO: Cloning cache of Libz from https://github.com/BioJulia/Libz.jl.git
INFO: Cloning cache of MbedTLS from https://github.com/JuliaWeb/MbedTLS.jl.git
INFO: Cloning cache of SHA from https://github.com/staticfloat/SHA.jl.git
INFO: Cloning cache of URIParser from https://github.com/JuliaWeb/URIParser.jl.git
INFO: Cloning cache of WinRPM from https://github.com/JuliaPackaging/WinRPM.jl.git
INFO: Cloning cache of ZMQ from https://github.com/JuliaInterop/ZMQ.jl.git
INFO: Installing BinDeps v0.6.0
INFO: Installing BufferedStreams v0.3.3
INFO: Installing Compat v0.26.0
INFO: Installing Conda v0.5.3
INFO: Installing IJulia v1.5.0
INFO: Installing JSON v0.12.0
INFO: Installing LibExpat v0.2.5
INFO: Installing Libz v0.2.4
INFO: Installing MbedTLS v0.4.5
INFO: Installing SHA v0.3.3
INFO: Installing URIParser v0.1.8
INFO: Installing WinRPM v0.2.5
INFO: Installing ZMQ v0.4.3
INFO: Building Conda
INFO: Building MbedTLS
Using system libraries...
INFO: Building WinRPM
WARNING: skipping repodata/repomd.xml, not in cache -- call WinRPM.update() to download
WARNING: skipping repodata/repomd.xml, not in cache -- call WinRPM.update() to download
INFO: Downloading https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_Leap_42.2/repodata/repomd.xml
INFO: Downloading https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_Leap_42.2/repodata/d9ba263c67d827ca79719896fabea00eb6e5ca0e3d75963e240e1b20518f4f39-primary.xml.gz
INFO: Downloading https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_Leap_42.2/repodata/repomd.xml
INFO: Downloading https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_Leap_42.2/repodata/9f17252bdf3c1033c5d30824cc69c71f5710b0a99ab45b8d172358de529a8917-primary.xml.gz
INFO: Building ZMQ
INFO: Updating WinRPM package list
INFO: Downloading https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_Leap_42.2/repodata/repomd.xml
INFO: Downloading https://cache.julialang.org/http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_Leap_42.2/repodata/repomd.xml
INFO: Packages to install: libwinpthread1, libgcc_s_seh1, libstdc++6, zeromq
INFO: Downloading: libwinpthread1
INFO: Extracting: libwinpthread1
INFO: Downloading: libgcc_s_seh1
INFO: Extracting: libgcc_s_seh1
INFO: Downloading: libstdc++6
INFO: Extracting: libstdc++6
INFO: Downloading: zeromq
INFO: Extracting: zeromq
INFO: Complete
INFO: Building IJulia
INFO: Installing Jupyter via the Conda package.
INFO: Downloading miniconda installer ...
INFO: Installing miniconda ...
Warning: 'defaults' already in 'channels' list, moving to the top
Fetching package metadata ...........
Solving package specifications: .

# All requested packages already installed.
# packages in environment at C:\home\kuroki\.julia\v0.5\Conda\deps\usr:
#
conda                     4.3.21                   py27_0
Fetching package metadata ...........
Solving package specifications: .

Package plan for installation in environment C:\home\kuroki\.julia\v0.5\Conda\deps\usr:

The following NEW packages will be INSTALLED:

    backports:           1.0-py27_0
    backports_abc:       0.5-py27_0
    bleach:              1.5.0-py27_0
    colorama:            0.3.9-py27_0
    configparser:        3.5.0-py27_0
    decorator:           4.0.11-py27_0
    entrypoints:         0.2.2-py27_1
    functools32:         3.2.3.2-py27_0
    get_terminal_size:   1.0.0-py27_0
    html5lib:            0.999-py27_0
    icu:                 57.1-vc9_0     [vc9]
    ipykernel:           4.6.1-py27_0
    ipython:             5.3.0-py27_0
    ipython_genutils:    0.2.0-py27_0
    ipywidgets:          6.0.0-py27_0
    jinja2:              2.9.6-py27_0
    jpeg:                9b-vc9_0       [vc9]
    jsonschema:          2.6.0-py27_0
    jupyter:             1.0.0-py27_3
    jupyter_client:      5.0.1-py27_0
    jupyter_console:     5.1.0-py27_0
    jupyter_core:        4.3.0-py27_0
    libpng:              1.6.27-vc9_0   [vc9]
    markupsafe:          0.23-py27_2
    mistune:             0.7.4-py27_0
    nbconvert:           5.2.1-py27_0
    nbformat:            4.3.0-py27_0
    notebook:            5.0.0-py27_0
    pandocfilters:       1.4.1-py27_0
    path.py:             10.3.1-py27_0
    pathlib2:            2.2.1-py27_0
    pickleshare:         0.7.4-py27_0
    prompt_toolkit:      1.0.14-py27_0
    pygments:            2.2.0-py27_0
    pyqt:                5.6.0-py27_2
    python-dateutil:     2.6.0-py27_0
    pyzmq:               16.0.2-py27_0
    qt:                  5.6.2-vc9_4    [vc9]
    qtconsole:           4.3.0-py27_0
    scandir:             1.5-py27_0
    simplegeneric:       0.8.1-py27_1
    singledispatch:      3.4.0.3-py27_0
    sip:                 4.18-py27_0
    ssl_match_hostname:  3.4.0.2-py27_1
    testpath:            0.3.1-py27_0
    tornado:             4.5.1-py27_0
    traitlets:           4.3.2-py27_0
    wcwidth:             0.1.7-py27_0
    widgetsnbextension:  2.0.0-py27_0
    win_unicode_console: 0.5-py27_0
    zlib:                1.2.8-vc9_3    [vc9]

icu-57.1-vc9_0 100% |###############################| Time: 0:00:46 782.12 kB/s
jpeg-9b-vc9_0. 100% |###############################| Time: 0:00:00 975.75 kB/s
zlib-1.2.8-vc9 100% |###############################| Time: 0:00:00   1.19 MB/s
backports-1.0- 100% |###############################| Time: 0:00:00   0.00  B/s
backports_abc- 100% |###############################| Time: 0:00:00   0.00  B/s
colorama-0.3.9 100% |###############################| Time: 0:00:00 238.09 kB/s
decorator-4.0. 100% |###############################| Time: 0:00:00   0.00  B/s
functools32-3. 100% |###############################| Time: 0:00:00   0.00  B/s
ipython_genuti 100% |###############################| Time: 0:00:00 405.99 kB/s
libpng-1.6.27- 100% |###############################| Time: 0:00:00 709.65 kB/s
markupsafe-0.2 100% |###############################| Time: 0:00:00   0.00  B/s
mistune-0.7.4- 100% |###############################| Time: 0:00:00 783.73 kB/s
pandocfilters- 100% |###############################| Time: 0:00:00 839.99 kB/s
path.py-10.3.1 100% |###############################| Time: 0:00:00   1.60 MB/s
pygments-2.2.0 100% |###############################| Time: 0:00:01 826.19 kB/s
pyzmq-16.0.2-p 100% |###############################| Time: 0:00:00 730.35 kB/s
scandir-1.5-py 100% |###############################| Time: 0:00:00 297.40 kB/s
simplegeneric- 100% |###############################| Time: 0:00:00   0.00  B/s
sip-4.18-py27_ 100% |###############################| Time: 0:00:00 629.78 kB/s
wcwidth-0.1.7- 100% |###############################| Time: 0:00:00 234.74 kB/s
win_unicode_co 100% |###############################| Time: 0:00:00 295.24 kB/s
configparser-3 100% |###############################| Time: 0:00:00 338.81 kB/s
get_terminal_s 100% |###############################| Time: 0:00:00   0.00  B/s
html5lib-0.999 100% |###############################| Time: 0:00:00 803.71 kB/s
jinja2-2.9.6-p 100% |###############################| Time: 0:00:00 726.37 kB/s
jsonschema-2.6 100% |###############################| Time: 0:00:00   6.93 MB/s
pathlib2-2.2.1 100% |###############################| Time: 0:00:00   0.00  B/s
prompt_toolkit 100% |###############################| Time: 0:00:00 432.24 kB/s
python-dateuti 100% |###############################| Time: 0:00:00 461.94 kB/s
qt-5.6.2-vc9_4 100% |###############################| Time: 0:01:38 588.30 kB/s
singledispatch 100% |###############################| Time: 0:00:00   0.00  B/s
ssl_match_host 100% |###############################| Time: 0:00:00   0.00  B/s
traitlets-4.3. 100% |###############################| Time: 0:00:00   1.37 MB/s
bleach-1.5.0-p 100% |###############################| Time: 0:00:00   1.38 MB/s
entrypoints-0. 100% |###############################| Time: 0:00:00   0.00  B/s
jupyter_core-4 100% |###############################| Time: 0:00:00   2.42 MB/s
pickleshare-0. 100% |###############################| Time: 0:00:00   0.00  B/s
pyqt-5.6.0-py2 100% |###############################| Time: 0:00:04   1.06 MB/s
testpath-0.3.1 100% |###############################| Time: 0:00:00 961.56 kB/s
tornado-4.5.1- 100% |###############################| Time: 0:00:00   1.17 MB/s
ipython-5.3.0- 100% |###############################| Time: 0:00:01 793.74 kB/s
jupyter_client 100% |###############################| Time: 0:00:00 725.36 kB/s
nbformat-4.3.0 100% |###############################| Time: 0:00:00   1.47 MB/s
ipykernel-4.6. 100% |###############################| Time: 0:00:00   1.48 MB/s
nbconvert-5.2. 100% |###############################| Time: 0:00:00   1.41 MB/s
jupyter_consol 100% |###############################| Time: 0:00:00   2.43 MB/s
notebook-5.0.0 100% |###############################| Time: 0:00:06 811.37 kB/s
qtconsole-4.3. 100% |###############################| Time: 0:00:00   1.10 MB/s
INFO menuinst_win32:__init__(182): Menu: name: 'Anaconda${PY_VER} ${PLATFORM}', prefix: 'C:\home\kuroki\.julia\v0.5\Conda\deps\usr', env_name: 'None', mode: 'None', used_mode: 'user'
INFO menuinst_win32:__init__(182): Menu: name: 'Anaconda${PY_VER} ${PLATFORM}', prefix: 'C:\home\kuroki\.julia\v0.5\Conda\deps\usr', env_name: 'None', mode: 'None', used_mode: 'user'
INFO menuinst_win32:__init__(182): Menu: name: 'Anaconda${PY_VER} ${PLATFORM}', prefix: 'C:\home\kuroki\.julia\v0.5\Conda\deps\usr', env_name: 'None', mode: 'None', used_mode: 'user'
widgetsnbexten 100% |###############################| Time: 0:00:01 587.70 kB/s
ipywidgets-6.0 100% |###############################| Time: 0:00:00 698.50 kB/s
jupyter-1.0.0- 100% |###############################| Time: 0:00:00   0.00  B/s
INFO: Found Jupyter version 4.3.0: C:\home\kuroki\.julia\v0.5\Conda\deps\usr\Scripts\jupyter
Writing IJulia kernelspec to C:\home\kuroki\.julia\v0.5\IJulia\deps\julia-0.5\kernel.json ...
Installing julia kernelspec julia-0.5
[InstallKernelSpec] Installed kernelspec julia-0.5 in C:\Users\genkuroki\AppData\Roaming\jupyter\kernels\julia-0.5
INFO: Package database updated

julia>

4 Jupyter NotebookからJuliaが使えない

実行しようとしてみたら、Anaconda2もなぜかインストールされていることに気付いた。

Anaconda2関係のファイルは

C:\home\kuroki\.julia\v0.5\Conda\

以下にインストールされていた(miniconda)。

気にせずにそれぞれのJupyter Notebookを起動してみた。

Anaconda2版

Anaconda3版

どちらもブラウザ(私は Google Chrome を使っている)で Jupyter Notebook が立ち上がり、 Anaconda2版ではPython2が選択可能になり、 Anaconda3版ではPython3が選択可能になった。

たぶん、Julia経由で利用できるPython 2の方になるのではないか?

Notebook の初期フォルダの位置が嫌だったので他の場所に変えたい。 そのためにはどうすればよいのか?

Anaconda2のJupyter Notebookショートカットのリンク先の最後の方が切れていて、

C:\home\kuroki\.julia\v0.5\Conda\deps\usr\python.exe C:\home\kuroki\.julia\v0.5\Conda\deps\usr\cwp.py C:\home\kuroki\.julia\v0.5\Conda\deps\usr "C:/home/kuroki/.julia/v0.5/Conda/deps/usr/python.exe" "C:/home/kuroki/.julia/v0.5/Conda/deps/usr/Scripts/jupyter-n

となっていることにも気付いた。そこで環境変数JC (Julia Condaの略)を

JC=C:\home\kuroki\.julia\v0.5\Conda\deps\usr

に設定し、Anaconda2のJupyter Notebookショートカットのコピーのリンク先を次のように修正した。

%JC%\python.exe %JC%\cwp.py %JC% "%JC%/python.exe" "%JC%/Scripts/jupyter-notebook-script.py" C:\home\kuroki\Dropbox\Jupyter

たぶんこれで正しいのだと思う。 これの最後に追加したフォルダ(ディレクトリ)が作成されていないと起動しなくなるので注意。 これで初期フォルダはそのフォルダに変更される。

同様に、Anaconda3のJupyter Notebookショートカットをコピーして、 そのリンク先の最後の %USERPROFILE% 次のように書き換えた。

C:\Anaconda3\python.exe C:\Anaconda3\cwp.py C:\Anaconda3 "C:/Anaconda3/python.exe" "C:/Anaconda3/Scripts/jupyter-notebook-script.py" C:\home\kuroki\Dropbox\Jupyter

以上によってショートカットの不具合が修正され、 初期フォルダも好きな場所に設定できることがわかった。

ひとまず、Anaconda2のJupyter Notebookの方を試してみよう。

New→Julia 0.5.2を試しても以下のスクリーンショットのようにDead kernelの繰り返しで使えない。

環境変数を設定して、IJuliaを再インストール

まず、Anaconda2をアンインストールした。 C:\home\kuroki\.julia 以下も全部削除した。

次に、

http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/install/

を参考にして次の環境変数を設定した。

JULIA_HOME=C:\Julia-0.5.2\bin
JULIA_PKGDIR=C:\Julia-0.5.2\Pkg
JC=C:\Julia-0.5.2\Pkg\v0.5\Conda\deps\usr

Juliaを起動して、

Pkg.init()
Pkg.add("IJulia")

を実行。これでパッケージは JULIA_PKGDIR 以下にインストールされるようになる。 ショートカットも上でやったのと同じように修正した。 その結果、以下のスクリーンショットのようにJupyter NotebookでJulia-0.5.2が使えるようになった。

Dead kernelになる理由は IJulia パッケージが見つからないことだという意味の エラーメッセージが出ていたので、JULIA_PKGDIRの設定が効いたのだと思われる。

JuliaからPythonを利用

Julia で

Pkg.add("PyPlot")

を実行。インストールが終わるまでしばらくかかる。

To use a different Python version, set ENV["PYTHON"]="pythoncommand" and re-run Pkg.build("PyCall").

ということらしい。PyPlotを入れれば、自動的にPyCallもインストールされる。 この方法を使えば、Juliaから使うPythonを別のものに変えることができる。そのことは

http://qiita.com/tenfu2tea/items/d2ac1427eaed7a548287

に詳しく書いてある。

PyPlotが使えることを確認するために

https://github.com/JuliaPy/PyPlot.jl

に書いてある例

using PyPlot
x = linspace(0,2*pi,1000); y = sin(3*x + 4*cos(2*x));
plot(x, y, color="red", linewidth=2.0, linestyle="--")
title("A sinusoidally modulated sinusoid")

を試してみた。

成功。

次にAnaconda3のpythonをJuliaから使うためにJuliaを起動して次を実行した。

using PyCall

PyCall.pyversion
PyCall.pyprogramname
PyCall.libpython

ENV["PYTHON"]="C:\\Anaconda3\\python.exe"
rm(Pkg.dir("PyCall","deps","PYTHON"))
Pkg.build("PyCall")

PyCall.pyversion
PyCall.pyprogramname
PyCall.libpython

以上でWindows上でJuliaをJupyter Notebookから使えるようにするための試行錯誤の紹介を終える。 多分、Juliaを使うような人はWindows上で使わないことの方が普通なのではないか? 情報も少なく、試行錯誤が必要になった。