すこしふしぎ.

VR/HI系院生による技術ブログ.まったりいきましょ.(友人ズとブログリレー中.さぼったら焼肉おごらなきゃいけない)

matplotlibが動かなくなった話(soxインストールのせい?)

こんばんは.1000chです. 皆さん3連休いかがお過ごしでしたか? 自分は「部屋の片付けをして快適な開発ライフを!」という目標を掲げ, 積み重なった漫画を整理していたら連休が終わっていました. そして気づいたら体調を崩し、今日は一日家で開発もとい安静にしています.

悪いことは続くもので,前回以降久しぶりにサウンド処理のプログラムを動かそうとするもなぜかエラー頻出で動かなくなりました. どうやら原因はmatplotlibにあるようですが,果たして何が起きたのでしょうか...

ということで今回は,動かなくなったmatplotlibとの戦いの様子をメモしておきます. あらかじめ言っておきますがいつになく地味です

症状

前回以降はじめて,matplotlibを含むプログラムを走らせました.すると.

(py3)1000ch% tempo_analysis.py 
Traceback (most recent call last):
  File "tempo_analysis.py", line 7, in <module>
    import matplotlib.pyplot as plt
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/pyplot.py", line 24, in <module>
    import matplotlib.colorbar
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/colorbar.py", line 29, in <module>
    import matplotlib.collections as collections
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/collections.py", line 23, in <module>
    import matplotlib.backend_bases as backend_bases
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/backend_bases.py", line 50, in <module>
    import matplotlib.textpath as textpath
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/textpath.py", line 11, in <module>
    import matplotlib.font_manager as font_manager
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/font_manager.py", line 53, in <module>
    from matplotlib import ft2font
ImportError: dlopen(/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/ft2font.so, 2): Library not loaded: /usr/local/lib/libpng15.15.dylib
  Referenced from: /usr/local/lib/libfreetype.6.dylib
  Reason: image not found

なにやらごにょごにょ出ています. 尚断言しますがプログラムは変更していません!

前回スペクトログラムを出してから行った変更と言えばsoxbrew経由でDLした事くらいです. がまぁ,おそらくmatplotlib周りの環境が少しぶっ壊れたという事でしょう.

今回はこれを修正してきちんとグラフ表示させるところまでもっていきます.

ぐぐってみる

とりあえずエラーメッセージでググってみました.

で 出てきたのはこんな感じ.

Import error on OS X: Reason: image not found

なかなか近そうです.

要旨としてはlibfreetypeのdllが無いよ!ってエラーに対しその辺にある他のやつコピペすれば?というよう感じでしょうか.

自分の場合,

ImportError: dlopen(/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/ft2font.so, 2): Library not loaded: /usr/local/lib/libpng15.15.dylib
  Referenced from: /usr/local/lib/libfreetype.6.dylib
  Reason: image not found

とのことなので,libfreetypeのdylibは見つかっている様子.

悪いのは/user/local/lib以下にlibpng15.15.dylibが居ないことのようです.

libbpngを探す

じゃーそんなんほんとにいるの?ってことでfindしてみます.

find ~/ -name "libpng15.15.dylib"

(py3)1000ch% find / -name "libpng15.15.dylib"      
find: /.DocumentRevisions-V100: Permission denied
find: /.fseventsd: Permission denied
find: /.Spotlight-V100: Permission denied
find: /.Trashes: Permission denied
find: /Applications/BookletCreator.app: Permission denied
/Applications/Pd-extended.app/Contents/lib/libpng15.15.dylib
/Applications/SuperCollider/SuperCollider.app/Contents/MacOS/libpng15.15.dylib
/Applications/TeX/TeXworks.app/Contents/MacOS/libpng15.15.dylib

#略

どうも様々なアプリケーションの中にいるみたいですね. じゃーこれをコピペすればいいんかな?

ということでTeXworks内のdylibをcpしてみると...

(py3)1000ch% tempo_analysis.py  
Traceback (most recent call last):
  File "tempo_analysis.py", line 7, in <module>
    import matplotlib.pyplot as plt
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/pyplot.py", line 24, in <module>
    import matplotlib.colorbar
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/colorbar.py", line 29, in <module>
    import matplotlib.collections as collections
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/collections.py", line 23, in <module>
    import matplotlib.backend_bases as backend_bases
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/backend_bases.py", line 50, in <module>
    import matplotlib.textpath as textpath
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/textpath.py", line 11, in <module>
    import matplotlib.font_manager as font_manager
  File "/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/font_manager.py", line 53, in <module>
    from matplotlib import ft2font
ImportError: dlopen(/Users/1000ch/.virtualenvs/py3/lib/python3.3/site-packages/matplotlib/ft2font.so, 2): Library not loaded: /usr/local/lib/libpng15.15.dylib
  Referenced from: /usr/local/lib/libfreetype.6.dylib
  Reason: Incompatible library version: libfreetype.6.dylib requires version 33.0.0 or later, but libpng15.15.dylib provides version 31.0.0

だめかー(´・ω・`) 微妙にエラーメッセージ変わってるけど..

15.15.dylibはlibfreetypeのver33に対応していない?どういうことだってばよ? 今まで15.15.dylibで動いてたのでは?

/usr/local/libの中身をみてみる

本当に/usr/local/lib以下からlibpngは消えたのか?ということで,そちらをlsしてみます.

(py3)1000ch% ls /usr/local/lib/libpng*   
/usr/local/lib/libpng.a
/usr/local/lib/libpng15.15.dylib
/usr/local/lib/libpng16.a
/usr/local/lib/libpng.dylib
/usr/local/lib/libpng16.16.dylib
/usr/local/lib/libpng16.dylib

ここにある15のdylibは先程cpしたやつです.

どうやら,何らかの原因でlibpngが16にバージョンアップし,libfreetypeで参照しているバージョンと差が発生していることがエラーの原因っぽい気がしてきました.

改めてlibpngを探す

先程はとりあえず見つかったlibpngをcpしましたが,あらためて別のlibpngを探してみます.

1000ch% sudo find / -name libpng15.15.dylib   
Password:
/Applications/Pd-extended.app/Contents/lib/libpng15.15.dylib
/Applications/SuperCollider/SuperCollider.app/Contents/MacOS/libpng15.15.dylib
/Applications/TeX/TeXworks.app/Contents/MacOS/libpng15.15.dylib
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/opt/X11/lib/libpng15.15.dylib
/usr/local/Cellar/libpng/1.5.13/lib/libpng15.15.dylib
/usr/local/Cellar/libpng/1.5.14/lib/libpng15.15.dylib
/usr/local/Cellar/libpng/1.5.17/lib/libpng15.15.dylib
/usr/local/Cellar/libpng/1.5.18/lib/libpng15.15.dylib
/usr/local/lib/libpng15.15.dylib

あ!Celler/libpng以下にバージョン違いのlibpng15.15.dylibが存在します!(ややこしい

15.15の中でも最新っぽい1.5.18以下のlibpngを使えばあるいは?

ということでlnします(libpng16系が全てシンボリックリンクになっていたのでcpやめました

# /usr/local/lib にいます
1000ch% ln -s /usr/local/Cellar/libpng/1.5.18/lib/libpng15.15.dylib ./







動いた!!!



というわけで,無事matplotlibが動くようになりました! これでレポートかけるよ!

しかし...

グラフの表示はできるのですが,グラフの保存ボタンを押すとプログラムが落ちる現象に見舞われています...

最悪スクショで何とかなるのでとりあえず放置していますが,解決策があれば直したいところです.