積極的に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が無くてパッケージ問題解決できずとエラー(不足するパッケージはfreetypeとpngパッケージ)
$ 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側で自前解決。。(手動でパッケージ入れるたびにCygwinとcygwinパッケージ管理システムを再起動すべきだったのか??)
$ 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ぐらいすぐに入るので、gccをcygwinパッケージで入れる。
が、、素のgcc版とMingwのgcc版があってどう違うのか??分からず。少しググって、、MingwはWin32APIに適用して、普通のgccはPOSIX 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
■補足
cygwinでpython+numpyを入れるには、cygwin管理によるパッケージインストールが便利だし、そっちに頼るべき。このとき、CygwinTerminalを開けたままでpython3 install -> numpyインストールとやると、multiarrayがimportできない等とエラーになった。パッケージインストール後、パスをクリアするためにも一旦cygwinTerminalは閉じて再度起動してから動作確認するのが良い。また、最初、cygwin管理のパッケージでnumpyが提供されているのに気づかず、pipで入れようとしたら、ヘッダがないとか怒られて中断した。この場合、ただしくuninstallしておくべき。そうでないとロードパス上に中途半端なバイナリがあると矛盾を起こす可能性がある。
python3 -m pip uninstall numpy
*2:http://stackoverflow.com/questions/32188180/from-matplotlib-backends-import-tkagg-importerror-cannot-import-name-tkagg
*3:http://stackoverflow.com/questions/32188180/from-matplotlib-backends-import-tkagg-importerror-cannot-import-name-tkagg/32188389
*4:https://www.codefull.org/2015/12/installing-scipy-numpy-and-matplotlib-under-cygwin/