chakokuのブログ(rev4)

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

ゼロから作るDeep Learning【DLfS】取り組み、Cygwin環境にPython3と各種パッケージを導入

積極的にPython3Xを使う理由が無かったので普段はPython2Xを使っていた。ゼロから作る(以降、DLfs(DeepLearning from scratchとか風)ではPy3なので、そっちを入れる。Pythonが動く環境はいろいろだけど、Cygwinを使うことが多いので、Cygwin環境でCygwinのSetupツールを走らせてPython3を入れてみる。
Cygwin環境で、Python3はパッケージ提供されているので、Cygwinのセットアップツール(setup-x86)でパッケージ:python3を選択することですんなり入る。続いて、numpyもパッケージ:python3-numpyを選択すればOK。
一方、matplotlibはCygwinのパッケージにないので、普通のPythonの流儀に従って入れる必要あり。
matplotlibのサイトには、pipを使って入れろとなっている。これが、、はまりにはまった。。

python -m pip install -U pip setuptools
python -m pip install matplotlib

そもそもpython3用のpipが入ってないのでまずpipを入れる。pipはeasy_insatllで入れるけど、自分のCygwin環境にはpython2Xとpython3Xが同居しているので、普通にeasy_installを打つとpython2環境にパッケージが入る。/usr/bin/配下にはpython2用とpython3用のeasy_insatllが入っているので、python3用を指定してpipを入れる。

$ ls /usr/bin/easy_install*
/usr/bin/easy_install*  /usr/bin/easy_install-2.7*  /usr/bin/easy_install-3.4*
/usr/bin/easy_insatll-3.4 pip

 *略*
Installing pip script to /usr/bin
Installing pip3 script to /usr/bin
Installing pip3.4 script to /usr/bin

pip3とpip3.4の二つが入った。違いとしては、、以下だけど、、entry_point?が違うだけ。。うーん。何だ。。

$ diff /usr/bin/pip3  /usr/bin/pip3.4
2c2
< # EASY-INSTALL-ENTRY-SCRIPT: 'pip==8.1.2','console_scripts','pip3'
---
> # EASY-INSTALL-ENTRY-SCRIPT: 'pip==8.1.2','console_scripts','pip3.4'
9c9
<         load_entry_point('pip==8.1.2', 'console_scripts', 'pip3')()
---
>         load_entry_point('pip==8.1.2', 'console_scripts', 'pip3.4')()

matplotlibのサイトでは、pipは単体で実行せず、pythonスクリプトから-mオプションで使えとなっているのでそれに倣って実行。 updateは普通に動いた。

$ python3 -m pip install -U pip setuptools
Requirement already up-to-date: pip in /usr/lib/python3.4/site-packages/pip-8.1.2-py3.4.egg
Collecting setuptools
  Using cached setuptools-28.6.1-py2.py3-none-any.whl
Installing collected packages: setuptools
  Found existing installation: setuptools 15.2
    Uninstalling setuptools-15.2:
      Successfully uninstalled setuptools-15.2
Successfully installed setuptools-28.6.1

次に本題のmatplotlibだけど、pkg-configが無くてパッケージ問題解決できずとエラー(不足するパッケージはfreetypepngパッケージ)

$ python3 -m pip install matplotlib
Collecting matplotlib
  Using cached matplotlib-1.5.3.tar.gz
    Complete output from command python setup.py egg_info:
    IMPORTANT WARNING:
        pkg-config is not installed.
        matplotlib may not be able to find some of its dependencies
         *略*
    ============================================================================
                            * The following required packages can not be built:
                            * freetype, png

pkgconfigというパッケージが配布されているようなので、、pipの流儀で入れてみる。
pipでパッケージ:pkgconfigをインストール。pkgconfigが入ったので、再度matplotlibを入れるけど、pkg-configが無いと怒られる。

$ python3 -m pip install pkgconfig
Collecting pkgconfig
  Downloading pkgconfig-1.1.0.tar.gz
Installing collected packages: pkgconfig
  Running setup.py install for pkgconfig ... done
Successfully installed pkgconfig-1.1.0

$ python3 -m pip install matplotlib
Collecting matplotlib
  Using cached matplotlib-1.5.3.tar.gz
    Complete output from command python setup.py egg_info:
    IMPORTANT WARNING:
        pkg-config is not installed.
        matplotlib may not be able to find some of its dependencies

pkgconfigはpkg-configのAPI版だとかで、元になったpykg-configというのがあるようでそれを入れる。

$ python3 -m pip install pykg-config
Collecting pykg-config
  Downloading pykg-config-1.3.0.tar.gz
Installing collected packages: pykg-config
  Running setup.py install for pykg-config ... done
Successfully installed pykg-config-1.3.0

pykg-confgはpkg-configの後釜版らしい

pykg-config 1.3.0	4	pkg-config replacement.

pkg-config問題は根が深いので、、足りないと怒られるパッケージを手で入れてみる(手動パッケージ管理)

$ python3 -m pip install freetype
Collecting freetype
  Could not find a version that satisfies the requirement freetype (from versions: )
No matching distribution found for freetype

$ python3 -m pip install png
Collecting png
  Could not find a version that satisfies the requirement png (from versions: )
No matching distribution found for png

手動パッケージインストールもまた怒られる。。

Pythonのパッケージ一覧サイトpypiでfree_typeを検索すると、freetype-pyがパッケージ名称のようで、再度トライ
https://pypi.python.org/pypi?%3Aaction=search&term=freetype&submit=search

$ python3 -m pip install freetype-py
   *略*
Successfully installed freetype-py-1.0.2

で、再度、matplotlibを入れてみる(png問題はおいといて)
freetypeについては再度怒られる。。で、、メッセージをよーく読むと、ft2buid.hが無いのが問題らしい。
これはソースのヘッダなので、freetypeのソースが必要かと。freetypeのdev packageが必要では。

                  freetype: no  [The C/C++ header for freetype2 (ft2build.h)
                            could not be found.  You may need to install the
                            development package.]
                       png: no  [pkg-config information for 'libpng' could not
                            be found.]

cygwinパッケージを確認すると、libfreetype-develというDevelパッケージがあって、過去にインストール済みであった。。freetype2でないから該当ヘッダが無いのだろう。。
だんだんCygwin環境のPython3でmatplotlibを動かせる気がしなくなってきたけど、、同じ考え方で、pngの方を手当してみる。
ここでやったのは、linbpng-develをcygwinパッケージでインストールした。この時、ダイアログで更新パッケージ一覧がダラダラっと流れて、python package manager??何とかも更新等と表示された。なんで今さらパッケージマネジャを更新するのかと不思議に思って再度matplotlibをトライ、するとパッケージマネージャが正常に動き出して、一連のパッケージ問題もpython側で自前解決。。(手動でパッケージ入れるたびにCygwincygwinパッケージ管理システムを再起動すべきだったのか??)

$ python3 -m pip install matplotlib
Collecting matplotlib
  Using cached matplotlib-1.5.3.tar.gz
Requirement already satisfied (use --upgrade to upgrade): numpy>=1.6 in /usr/lib/python3.4/site-packages (from matplotlib)
Collecting python-dateutil (from matplotlib)
  Using cached python_dateutil-2.5.3-py2.py3-none-any.whl
Collecting pytz (from matplotlib)

*略*
    unable to execute 'gcc': No such file or directory
    error: command 'gcc' failed with exit status 1

最後のエラーがgccないというもので、gccぐらいすぐに入るので、gcccygwinパッケージで入れる。
が、、素のgcc版とMingwgcc版があってどう違うのか??分からず。少しググって、、MingwはWin32APIに適用して、普通のgccPOSIX APIに準拠と浅く理解。Win32APIは要らない(本当か?Windows環境でグラフを出すのに!?)と推測して、普通のgccを入れてみる。パッケージ:cygwin32-gcc-coreを選択。 だけど、、、パッケージインストール状況を見ていると、Win32とかチラチラ見えて、、実はWin32対応もなされているのではと想像。。
gcc ,cc コマンドを打つがコマンド見つかりませんのエラー、コンパイラの実態はあるけどgccからのリンクがない。。コアパッケージだから、この辺の世話してくれないのか!?

$ gcc
-bash: gcc: コマンドが見つかりません
$ cc
-bash: cc: コマンドが見つかりません

$ ls /usr/bin/*cc*
/usr/bin/cyggcc_s-seh-1.dll            /usr/bin/i686-pc-cygwin-gcc-ar.exe
/usr/bin/i686-pc-cygwin-gcc.exe        /usr/bin/i686-pc-cygwin-gcc-nm.exe
/usr/bin/i686-pc-cygwin-gcc-5.4.0.exe  /usr/bin/i686-pc-cygwin-gcc-ranlib.exe

すなおに、パッケージ:gcc-coreを入れる。普通に入った。

$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/lto-wrapper.exe
ターゲット: x86_64-pc-cygwin
configure 設定: /cygdrive/i/szsz/tmpp/gcc/gcc-5.4.0-1.x86_64/src/gcc-5.4.0/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-5.4.0-1.x86_64/src/gcc-5.4.0 --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-tune=generic --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-graphite --enable-threads=posix --enable-libatomic --enable-libcilkrts --enable-libgomp --enable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --enable-libada --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id --with-default-libstdcxx-abi=gcc4-compatible
スレッドモデル: posix
gcc バージョン 5.4.0 (GCC)

準備は整ったので、改めてmatplotlibを入れる。

    copying lib/mpl_toolkits/tests/baseline_images/test_mplot3d/wireframe3dzerorstride.png -> build/lib.cygwin-2.6.0-x86_64-3.4/mpl_toolkits/tests/baseline_images/test_mplot3d
    UPDATING build/lib.cygwin-2.6.0-x86_64-3.4/matplotlib/_version.py
    set build/lib.cygwin-2.6.0-x86_64-3.4/matplotlib/_version.py to '1.5.3'
    running build_ext
    building 'matplotlib.ft2font' extension
    creating build/temp.cygwin-2.6.0-x86_64-3.4
    creating build/temp.cygwin-2.6.0-x86_64-3.4/src
    gcc -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -ggdb -O2 -pipe -Wimplicit-function-declaration
 -fdebug-prefix-map=/usr/src/ports/python3/python3-3.4.3-1.x86_64/build=/usr/src/debug/python3-3.4.3-1
 -fdebug-prefix-map=/usr/src/ports/python3/python3-3.4.3-1.x86_64/src/Python-3.4.3=/usr/src/debug/python3-3.4.3-1
 -DPY_ARRAY_UNIQUE_SYMBOL=MPL_matplotlib_ft2font_ARRAY_API -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
 -I/usr/lib/python3.4/site-packages/numpy/core/include -I/usr/include/libpng16 -I/usr/include/freetype2
 -I/usr/include -I. -I/usr/include/python3.4m -c src/ft2font.cpp
 -o build/temp.cygwin-2.6.0-x86_64-3.4/src/ft2font.o
    gcc: エラー: spawn: No such file or directory
    error: command 'gcc' failed with exit status 1

gccがエラーを出す。spawn??
少しググって、ファイル名がcpp(C++)で、gccからのspawnエラーだからg++が無いのが問題だろうと思われ、
g++を見繕って入れる。
ひとまず、、すなおに、パッケージ:gcc-g++を入れてみる。で、再度matplotlibをインストール

$ python3 -m pip install matplotlib
Collecting matplotlib
  Using cached matplotlib-1.5.3.tar.gz
Requirement already satisfied (use --upgrade to upgrade): numpy>=1.6 in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): python-dateutil in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): pytz in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): cycler in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): pyparsing!=2.0.4,!=2.1.2,>=1.5.6 in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): six>=1.5 in /usr/lib/python3.4/site-packages (from python-dateutil->matplotlib)
Installing collected packages: matplotlib
  Running setup.py install for matplotlib ... done
Successfully installed matplotlib-1.5.3

で、、matplotlibを試しに動かしてみると、、tkinterがないと。tkinterって、tcl/tkのinterfaceかなにかと推測される。

$ python3
Python 3.4.3 (default, May  5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
>>> import matplotlib.pyplot as plt
        *略*
ImportError: No module named 'tkinter'

pypiではTkinter自体を見つけることができず、cygwinパッケージで提供されているのでそちらを流用。
パッケージ:python3-tkinterをインストール、Tkinterが入ったけど、今度は、_tkaggでエラー。

$ python3
Python 3.4.3 (default, May  5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/site-packages/matplotlib/pyplot.py", line 114, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/usr/lib/python3.4/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/usr/lib/python3.4/site-packages/matplotlib/backends/backend_tkagg.py", line 13, in <module>
    import matplotlib.backends.tkagg as tkagg
  File "/usr/lib/python3.4/site-packages/matplotlib/backends/tkagg.py", line 9, in <module>
    from matplotlib.backends import _tkagg
RuntimeError: No such process

aggとはAnti-Grain Geometry*1という2D Graphicsのレンダリングエンジンらしい
tk経由でaggを呼び出そうとしてエラーを起こしているのだろうか!?
少しググると、、どうも、tk-devが無い状態でmatplotlibをコンパイルするとこのようなエラーになるそうで記事*2、、一旦matplotlibをアンインストールして、tkとtk-devを入れてから、再度ビルドしろとなっている。

sudo apt-get install tk8.5
sudo apt-get install tk-dev

現在のCygwin環境にはtcl-tkは入っていて、tcl-tk-develが入っていなかったので、これをCygwinパッケージでインストール、matplotlibを消して、cacheを使わないオプションでビルドしてみる。。記事*3を参照

python3 -m pip uninstall matplotlib
python3 -m pip --no-cache-dir install -U matplotlib

すると、、numpyも作り直しに入ってnumpyのビルドでエラー。。泥沼化。。
致命的なエラーとしては、xlocale.hが無いと。(普通の環境だったらありそうだけど。。)

    gcc: numpy/core/src/multiarray/numpyos.c
    numpy/core/src/multiarray/numpyos.c:18:21: 致命的エラー: xlocale.h: No such file or directory

場当たり的に -Uを取って再度ビルド、するとmatplotlibだけを構築した模様。(gccの表示とかないけどいいのか?)

$ python3 -m pip --no-cache-dir install  matplotlib
Requirement already satisfied (use --upgrade to upgrade): numpy>=1.6 in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): python-dateutil in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): pytz in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): cycler in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): pyparsing!=2.0.4,!=2.1.2,>=1.5.6 in /usr/lib/python3.4/site-packages (from matplotlib)
Requirement already satisfied (use --upgrade to upgrade): six>=1.5 in /usr/lib/python3.4/site-packages (from python-dateutil->matplotlib)
Installing collected packages: matplotlib
  Running setup.py install for matplotlib ... done
Successfully installed matplotlib-1.5.3

コンパイルせずにどこかからコンパイル済みのライブラリを取ってきてるだけのような気がするのだけど。。
一方、pytplot実行時のエラー状況は改善せず。
こうなったら最後の手段で、、Cygwin環境でmatplotlibをソースからビルドするか。。
Windows環境でさらにその中のCygwin環境でWin32APIを呼ぶ?Guiライブラリを構築するのは茨の道。。。

pipのキャッシュディレクトリがあるそうで、それを削除して再度ビルド

$ cd .cache/
$ ls
pip
$ rm -r pip/
$ python3 -m pip --no-cache-dir install  python-matplotlib
$ python3 -m pip --no-cache-dir install matplotlib

ビルドしてるのかどうかかなり怪しい。。で、、やはりエラー

$ python3
Python 3.4.3 (default, May  5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/site-packages/matplotlib/pyplot.py", line 114, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/usr/lib/python3.4/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/usr/lib/python3.4/site-packages/matplotlib/backends/backend_tkagg.py", line 13, in <module>
    import matplotlib.backends.tkagg as tkagg
  File "/usr/lib/python3.4/site-packages/matplotlib/backends/tkagg.py", line 9, in <module>
    from matplotlib.backends import _tkagg
RuntimeError: No such process
>>>

今後の方針
0. Ubuntu等に環境を切り替える
1. cygwin環境はそのままで
1-0 matplotlibは必須でないのであきらめる
1-1 あきらめずにさらに掘り下げる
1-1-1 エラーを起こしている、/usr/lib/python3.4/site-packages/matplotlib/backends/tkagg.pyをさらに調べる
1-1-2 tcl-tk自体正常に動くのか、pyからtkが動くのか確認する
1-1-3 backendをtkaggからQt等に変えてしまう

■粘着気質なので再開。。
ビルドしないのは、-Uをつけていないせいと思われる。-Uを付けると、多分依存関係でnumpyをビルドして、そっちでxlocale.hのエラーになる。Cygwin環境でxclocale.hまわりのエラーはよく発生するようで記事も多い。

一方、X11自体が必要という記事*4もあって、Cygwin環境でX11を入れてみる。(だがまだNG)

file:/usr/lib/python3.4/site-packages/matplotlib/mpl-data/matplotlibrc
によると、tkaggを指定しているけど、backendはtkaggに限らずgtkとかqtとか
でもいいらしい。さらには、PDFもあり。
今はまりまくっている、tkaggをやめて、他のバックエンドで代用するか。

# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.
backend      : tkagg

いっそのことQt4かQt5に切り替えということで、、Cygwin環境でパッケージ提供されている、python3-pyqt4 , python3-qt5をインストール、backendをtkaggからPyQt4に変更

# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.
backend      : Qt4Agg

# If you are using the Qt4Agg backend, you can choose here
# to use the PyQt4 bindings or the newer PySide bindings to
# the underlying Qt4 toolkit.
backend.qt4 : PyQt4        # PyQt4 | PySide

matplotlibのbackendを確認、Qt4Aggになっている

$ python3
Python 3.4.3 (default, May  5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> print(matplotlib.get_backend())
Qt4Agg

で、、X11サーバを裏で走らせる(必要かどうかは不明)、X11サーバにつなぎたいアプリ(X11を使いたいClient)が正しく接続できるように環境変数、DISPLAYを設定

run xwin -multiwindow -noclipboard
export DISPLAY=:0.0

以下の様な超シンプルサンプルを走らせる

#!/usr/bin/python3

import matplotlib.pyplot as plot

plot.scatter([1,2],[3,4])
plot.show()

すると、、以下のグラフが表示された。。これで環境ができた。PC再起動したらまた0に戻ったらつらいけど。


今日は環境を作っただけで終わった。。


http://matplotlib.org/users/installing.html#windows


■補足

cygwinpython+numpyを入れるには、cygwin管理によるパッケージインストールが便利だし、そっちに頼るべき。このとき、CygwinTerminalを開けたままでpython3 install -> numpyインストールとやると、multiarrayがimportできない等とエラーになった。パッケージインストール後、パスをクリアするためにも一旦cygwinTerminalは閉じて再度起動してから動作確認するのが良い。また、最初、cygwin管理のパッケージでnumpyが提供されているのに気づかず、pipで入れようとしたら、ヘッダがないとか怒られて中断した。この場合、ただしくuninstallしておくべき。そうでないとロードパス上に中途半端なバイナリがあると矛盾を起こす可能性がある。

 python3 -m pip uninstall numpy