chakokuのブログ(rev4)

日々のごった煮ブログです

遅ればせながら・・ Cygwin内にpythonのJupyterLabとmatplotlibを入れる

f:id:chakoku:20200215085006p:plain
JupyterLab画面
普段PythonCygwin環境内でCUIで使っていたけど、データ分析*1とかでグラフ描画が必要になった。Cygwin環境にMatplotlibを入れるのはイバラの道らしいので、グラフはUbuntu上のPython+Matplotlibで作成していた。試しでグラフ描くならこれでもいいけど、あれこれ条件を変えながらグラフを見たい場合は非常に効率が悪い。jupyter notebookがあるのは知っていたけど、どうもGUIに慣れなくて使っていなかった。が、、グラフを見ながらあれこれ試行錯誤するにはGUIベースでないとだめだと思い、最新版のjupyterlabをCygwin内で構築することにした。
jupyterlabはインストール時にコンパイルが発生するので、あらかじめgccとg++が必要なようである(本当に必要かどうかは不明。インストール時、コンパイルでトラブったので、多分そうなんだろうと)
pipでjupyterlabを入れる前に、 CygwinSetupを使って gcc(mingw64-i686-gcc-core 7.4.0-1)とgcc-g++(7.4.0-1)をあらかじめインストールしておいた(バージョンも合わせておくのがいいらしい(自分もビルド時にエラーが発生した))。
で、、以下のコマンドでpipでjupyterlabを入れる

python3 -m pip install jupyterlab

この手順でビルドさせると、Running setup.py install for pyzmq  の所でpyzmqをビルドしようとしてエラーになる。pyzmqはCygwinのパッケージ管理から入れられるので、CygwinSetupでpython3-zmq(17.0.0-1)を入れることでビルドを回避させる。
ビルドが終わると以下のコマンドでjupyterlabを起動(-m でなくても起動できるかも。詳しく調べてないので)

 python3 -m jupyterlab

上記コマンドでjupyterlab用のサーバアプリが起動される。接続URLが表示されるので、ブラウザにURLを入力するとJupyterLabのコンソールに接続される。

http://localhost:8888/?token=ae3e22*********c7620a6

JupyterLabを使いこなせてデータ分析がサクサク進むことを期待したい。。しかし、、notebookは慣れないなー。。

■追記 2020/02/15
さっそくjupyterを起動して試しにmatplotlibをインポートさせるとエラーになった。なるほど。。jupyterとはpython3上の薄皮だった。jupyterを入れたからといって、ML関連のパッケージまでは入らないと。

import matplotlib
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-0484cd13f94d> in <module>
----> 1 import matplotlib

ModuleNotFoundError: No module named 'matplotlib'

今のCygwin環境ならコンパイルも整っているし、matplotlibをビルドしてみることに

$ python3 -m pip install matplotlib

ビルドすると、 Cythonがないと怒られる

        from Cython.Compiler.Version import version as cython_version
    ModuleNotFoundError: No module named 'Cython'

Cythonを入れる

$ python3 -m pip install cython
Collecting cython
  Downloading Cython-0.29.15-py2.py3-none-any.whl (968 kB)
Installing collected packages: cython
Successfully installed cython-0.29.15

次はPython.hがないと怒られる。これはdevelで入れるかと。

    SystemError: Cannot compile 'Python.h'. Perhaps you need to install python-dev|python-devel.

CygwinSetupで、python36-devel (3.6.9-1)を入れる。もう一度ビルドする
またエラーになる。

    /bin/sh: svnversion: コマンドが見つかりません

svnリポジトリからとってくるつもりなのか!? svnを入れてみる。どれがいいのかよくわからないが、、 git-svn (2.21.0-1)を入れる。
さらにログをよく見るとコンパイル時にExceptionが出ているようにも思えて、、svnversionコマンドの有無が原因ではないような気も。。
再度ビルド。。やっぱりエラーになるのだが、、gccで loops.oを作るところでエラーになっている??

           *略*
      File "/usr/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1146, in run_setup
        raise DistutilsError("Setup script exited with %s" % (v.args[0],))
    distutils.errors.DistutilsError: Setup script exited with error: 
    Command "gcc  *略* -o build/temp.cygwin-3.1.2-x86_64-3.6/build/src.cygwin-3.1.2-x86_64-3.6/numpy/core/src/umath/loops.o  build/temp.cygwin-3.1.2-x86_64-3.6/build/src.cygwin-3.1.2-x86_64-3.6/numpy/core/src/umath/loops.o.d -std=c99" failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

上記エラーに関係しそうな情報は得られず。場当たり的にcache無しにして再度ビルド

$ python3 -m pip --no-cache-dir install matplotlib
Collecting matplotlib
  Downloading matplotlib-3.1.3.tar.gz (40.9 MB)
   ・・・・

やはり上記とおなじところでエラーになる。なぜ failedなのか詳細わからず。 check logなので、ログを見ろと。。
ちなみに、、直接の原因ではないが、以下のライブラリも無いと警告を受けている。

        Optimized (vendor) Blas libraries are not found.
        Lapack libraries not found.

メッセージをよく見ると、numpyをビルドしようとして失敗している。matplotlibを入れる際にまずnumpyをビルドするのか。。
numpyならcygwinパッケージで入れられるので、numpyを入れてから再度試すことに。
python36-numpy(1.16.2-1)をCygwinSetupから入れるが、、numpy自体が正常に動作しない状況になった。パッケージで入れてもnumpyがおかしい。
(おかしい件は、Cygwinを一旦終わって再度起動してからpython3を走らせると解消)
ちょっと進んだ。以下と怒られる

    src/checkdep_freetype2.c:1:10: 致命的エラー: ft2build.h: No such file or directory
     #include <ft2build.h>

ft2はfreetypeらしく、CygwinSetupで、libfreetype-devel(2.9.1-1)を入れる

なんとかビルドはできた。

$ python3 -m pip --no-cache-dir install  -U matplotlib
Collecting matplotlib
  Downloading matplotlib-3.1.3.tar.gz (40.9 MB)
 Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/lib/python3.6/site-packages (from matplotlib) (0.10.0)
Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /usr/lib/python3.6/site-packages (from matplotlib) (1.1.0)
Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/lib/python3.6/site-packages (from matplotlib) (2.4.6)
Requirement already satisfied, skipping upgrade: python-dateutil>=2.1 in /usr/lib/python3.6/site-packages (from matplotlib) (2.8.1)
Requirement already satisfied, skipping upgrade: numpy>=1.11 in /usr/lib/python3.6/site-packages (from matplotlib) (1.16.2)
Requirement already satisfied, skipping upgrade: six in /usr/lib/python3.6/site-packages (from cycler>=0.10->matplotlib) (1.14.0)
Requirement already satisfied, skipping upgrade: setuptools in /usr/lib/python3.6/site-packages (from kiwisolver>=1.0.1->matplotlib) (41.2.0)
Installing collected packages: matplotlib
    Running setup.py install for matplotlib ... done
Successfully installed matplotlib-3.1.3

ビルドできたので、python3で使ってみる。まずは試しにインポートする。
インポートはできた。

$ python3
Python 3.6.9 (default, Jul 21 2019, 14:33:59)
[GCC 7.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib

実際にグラフを描画しようとするとX11が無いとかTkがないといって怒られると思う。
やっぱり怒られる。まぁそれはそうだ

>>> import matplotlib.pyplot as plot
>>> plot.scatter([1,2],[3,4])
<matplotlib.collections.PathCollection object at 0x6ffffd077e10>
>>> plot.show()
__main__:1: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
>>>

これをjupyterでやったらどうなるか。。
試した結果、以下のように、jupyterlabではグラフ表示された。。すばらしい。。
これは本気でjupyterlabを勉強しなくては。。と思った次第です。

f:id:chakoku:20200215113402p:plain
jupyterlab内でMatPlotlibを使ってみる
■関連記事
かつてcygwinにmatplotlibを入れた時の記録
ゼロから作るDeep Learning【DLfS】取り組み、Cygwin環境にPython3と各種パッケージを導入 - chakokuのブログ(rev4)

*1:有志の勉強会とか。。