import cv がsegfalするので AnacondaでOpenCVしたMacの話
Macにpyenv+opencvをインストールしたいのです
pyenv install 2.7.3 でインストールしたもの (A)
npymath.ini
が見つからないエラー- scipyがインストール出来ない
pyenv virtualenv --distribute 2.7.3 venc27 でインストールしたもの (B)
libpython2.7.a
(libpython2.7.dylib
) が見つからない?
- scipyはインストールできる
- matplotlibがインストール出来ない
CC=clang pip install matplotlib
なら通る
Linux(Ubuntu) でインストールしてみる (C)
Ubuntuなら動く
(A) と コレ(C) を比較してみると (A)には PYTHON_PATH/lib/python2.7/site-packages/numpy/core
の下に lib ディレクトリが無い
=> numpyのインストールに失敗では?
numpyがきちんとインストールされない => opencvのpythonモジュールはnumpy必須なのでインストール出来ない
A,B はnumpyがきちんとインストールされていないであろうと思われる
どちらも numpyのimport_array() でsegfalしてる
このとき使ったインストールスクリプト
# brew switch ffmpeg 1.0 VERSION=2.4.3 INSTALL_DIR=$HOME/lib/opencv # PYTHON_HOME=$HOME/.pyenv/versions/venv27 PYTHON_HOME=$HOME/.pyenv/versions/2.7.3 PYTHON_VERSION=2.7 mkdir -p opencv cd opencv curl -L http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/${VERSION}/OpenCV-${VERSION}.tar.bz2/download -o OpenCV-${VERSION}.tar.bz2 tar jxvf OpenCV-${VERSION}.tar.bz2 mkdir -p ${INSTALL_DIR} cd OpenCV-${VERSION} mkdir -p build cd build cmake \ -G "Unix Makefiles" \ -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR \ -D BUILD_NEW_PYTHON_SUPPORT=ON \ -D PYTHON_LIBRARY=$HOME/.pyenv/versions/2.7.3/lib/libpython${PYTHON_VERSION}.a \ -D PYTHON_EXECUTABLE=$PYTHON_HOME/bin/python \ -D PYTHON_PACKAGES_PATH=$PYTHON_HOME/lib/python${PYTHON_VERSION}/site-packages \ -D PYTHON_INCLUDE_DIR=$PYTHON_HOME/include/python${PYTHON_VERSION} .. make -j4 make install
ScipySuperpackの力を借りる (D)
(A) や (B) とほぼ同じ import_array() でsegfalする
Anacondaの力を借りる (E)
scipy勉強会で知ったAnacondaを入れてみる
Anaconda - Scalable Data Analytics and Scientific Computing in Python
- パッケージコレクション
- Anaconda CE は無料
- 同梱されているパッケージはこちら http://docs.continuum.io/anaconda/1.3/pkgs.html
- Mac用はOpenCVは同梱されていない
- ローカルディレクトリにインストールできる
- matplotlibやqt, scikit-learnやpandas, cythonまで一緒にインストールされる お手軽!!
Anaconda すんなり入りませんでした
libgcc_s.1.dylibがない
Python 2.7.3 :: Continuum Analytics, Inc. creating default environment... Traceback (most recent call last): File "/Users/yano/lib/anaconda/pkgs/conda-1.3.5-py27_0/lib/python2.7/site-packages/conda/install.py", line 28, in <module> import json File "/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/json/__init__.py", line 108, in <module> from .decoder import JSONDecoder File "/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/json/decoder.py", line 5, in <module> import struct File "/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/struct.py", line 1, in <module> from _struct import * ImportError: dlopen(/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/lib-dynload/_struct.so, 2): Library not loaded: /usr/local/lib/libgcc_s.1.dylib Referenced from: /Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/lib-dynload/_struct.so Reason: image not found
みたいなエラーがでたので
ln -s /usr/lib/libgcc_s.1.dylib /usr/local/lib/libgcc_s.1.dylib
した
hfx_codecがインポートされてない
LookupError: unknown encoding: hex
と出てインストールが停止する。インストールスクリプトはAnacondaのインストール指定したディレクトリに展開されているので
~/lib/anaconda/pkgs/conda-1.3.5-py27_0/lib/python2.7/site-packages/conda/install.py
に
from encodings import hex_codec
を追加して、インストールを再開
Anacondaのインストーラーのシェルスクリプトから抜き出したものを再度実行する
PREFIX=/Users/yano/lib/anaconda PYTHON=python echo "creating default environment..." CONDA_INSTALL="$PREFIX/pkgs/conda-1.3.5-py27_0/lib/python2.7/site-packages/conda/install.py" $PYTHON $CONDA_INSTALL --prefix=$PREFIX --pkgs-dir=$PREFIX/pkgs --activate-all || exit 1 echo "installation finished."
pyenvにAnacondaを管理させるには
pyenvは ~/.pyenv/versions
ディレクトリ以下にPYTHON_PATHにあたるディレクトリをまるっと
移動させてやるとそれだけで認識してくれるので、
~/lib/anaconda
にインストールしたPythonとライブラリを anaconda ディレクトリをそのまま
~/.pyenv/versions/anaconda
として移動してやれば大丈夫だと思いましたが、
どうやらanacondaがインストールするライブラリの参照しているパスや、shebangのパスが
/usr/bin/env python
でなく決め打ちになっているので、
インストール時に指定するパスを ~/.pyenv/versions/anaconca
としましょう。
Anacondaのインストールはこれで終わり!
Anaconda環境にOpenCVをインストールする
さっきと同じようなスクリプトで。違いはPYTHON_HOME
とcmakeのPYTHON_LIBRARY
VERSION=2.4.3 INSTALL_DIR=$HOME/lib/opencv PYTHON_HOME=$HOME/.pyenv/versions/anaconda PYTHON_VERSION=2.7 mkdir -p opencv cd opencv curl -L http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/${VERSION}/OpenCV-${VERSION}.tar.bz2/download -o OpenCV-${VERSION}.tar.bz2 tar jxvf OpenCV-${VERSION}.tar.bz2 mkdir -p ${INSTALL_DIR} cd OpenCV-${VERSION} mkdir -p build cd build cmake \ -G "Unix Makefiles" \ -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR \ -D BUILD_NEW_PYTHON_SUPPORT=ON \ -D PYTHON_LIBRARY=$PYTHON_HOME/lib/libpython${PYTHON_VERSION}.dylib \ -D PYTHON_EXECUTABLE=$PYTHON_HOME/bin/python \ -D PYTHON_PACKAGES_PATH=$PYTHON_HOME/lib/python${PYTHON_VERSION}/site-packages \ -D PYTHON_INCLUDE_DIR=$PYTHON_HOME/include/python${PYTHON_VERSION} .. make -j4 make install
cv2.soが参照しているライブラリのパスがおかしい
先程はDYLD_FALLBACK_LIBRARY_PATH
を設定することで、この問題を回避しました。
libpython2.7.dylib
のパスがおかしいのですが、では、どこを参照しているかというと、
/opt/anaconda1anaconda2anaconda3/lib/libpython2.7.dylib
とかふざけたパスが設定されてるので、これをinstall_name_tool
で修正します
% cd ~/.pyenv/versions/anaconda/lib/python2.7/site-packages % install_name_tool -change /opt/anaconda1anaconda2anaconda3/lib/libpython2.7.dylib @executable_path/../lib/libpython2.7.dylib ./cv2.so
実行するpythonが~/.pyenv/versions/anaconda/bin
にあるので@executable_path
からの相対パスでいいと思います
追記:パスを修正するスクリプトを書きました >>
OpenCVのライブラリのパスはDYLD_LIBRARY_PATHに
追記:OpenCVのライブラリをanacondaに突っ込むスクリプトを書きました >>
OpenCVのライブラリのパスはずっとこのままの予定なので、DYLD_LIBRARY_PATH
にセットしちゃいます
```sh
opencv
if [ -n "$DYLD_LIBRARY_PATH" ]; then export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:~/lib/opencv/lib else export DYLD_LIBRARY_PATH=~/lib/opencv/lib fi
</del> <del> ライブラリパスを修正したのとpyenvで管理するようになったので、 `PATHとDYLD_FALLBACK_LIBRARY_PATH の設定`で設定した環境変数は両方要らなくなりました。消しましょう </dek> これで`penv global anaconda`などでanacondaのpythonが使えるようになって、 さらにimport cvしてもsegfalしなくなりました。やったね! # まとめ - Anaconda便利 - OpenCVのpythonモジュールインストールすげぇはまるというか鬼門はnumpyだと思う - pyenvとAnacondaは共存できる!