使用 pyenv 環境安裝 opencv3|解決各種疑難雜症
如果你在安裝 opencv3
到 mac 時,也和我一樣遭遇以下問題,歡迎參考我搜尋整理的解決方式。
- 由於
python
版本管理的需求,不想要使用homebrew
安裝的python
(因為是走整個系統的環境),而是想要使用pyenv
管理自己的python
版本 - 想要將
opencv3
安裝在virtualenvwrapper
搭建的虛擬環境中
以下的安裝步驟主要參考自 pyimagesearch: macOS: Install OpenCV 3 and Python 3.5 這篇教學,所以不會詳列所有安裝步驟,只會紀錄我遭遇的問題和解決方式
首先,Step #1 和 Step #2 都按照 pyimagesearch 的步驟走。
Step #3
由於我們想要將使用 pyenv
而非 homebrew
安裝 python
,因此這個步驟的更改如下。(需要先自行安裝好 pyenv
,安裝教學可參考這裡)
- 在建立
pyenv
環境之前,須確保pyenv
的python
開啟動態鏈結,因此需檢查環境變量PYTHON_CONFIGURE_OPTS
。
$ export PYTHON_CONFIGURE_OPTS=--enable-framework # for mac
$ export PYTHON_CONFIGURE_OPTS=--enable-shared # for linux
2. 建立 pyenv
環境
$ pyenv install 3.6.6 # 安裝python 3.6.6 的版本
$ pyenv shell 3.6.6 # 指定這個shell的python版本
* 如果在這個步驟出現 zipimport.ZipImportError
,很有可能是因為 Mac 版本是 Mojave 的關係,解決方式如下,具體原因請參考這裡。
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
$ pyenv install 3.6.6
繼續跟著 pyimagesearch 的 Step #4–5。
Step #7
在這個步驟中,要尋找作者提到的以下兩個路徑,如果完全跟著我做的話,則會是 python3.6
。
The path to your libpython3.5.dylib file.
The path to your Python.h headers for Python 3.5.
並將搜尋之後的結果,替換至執行 cmake
指令下的 YYY
和 ZZZ
。
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D PYTHON3_LIBRARY=YYY \
-D PYTHON3_INCLUDE_DIR=ZZZ \
-D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=ON ..
然而,作者提到的路徑是使用 homebrew
安裝時的環境路徑,那使用 pyenv
的路徑會在哪裡呢?
很簡單,只要執行 python-config --prefix
就可以找到,將作者提到的 YYY
和 ZZZ
的開頭替換成找到的路徑,確切的檔案位置再慢慢按 tab 鍵尋找。
具體來說,當我執行 python-config --prefix
,會顯示:
/Users/smhsu/.pyenv/versions/3.6.6/Python.framework/Versions/3.6
這裡就是我的檔案開頭路徑,因此我的YYY
和 ZZZ
路徑分別對應如下:
python_root = $(python-config --prefix)YYY = $(python_root)/lib/libpython3.6.dylib # python library
ZZZ = $(python_root)/include/python3.6m/ #include library
這裡請一定要自己按 tab 鍵尋找自己的檔案位置,由於安裝的 python
版本不一定一樣,所以這裡的路徑也不完全會一樣。
另外,由於除了YYY
和 ZZZ
要更改以外,我嘗試非常多次不同的 cmake
指令,以下是我最終成功的版本。
$ cmake -D CMAKE_BUILD_TYPE=Release \
-D PYTHON3_INCLUDE_DIR=${python_root}/include/python3.6m \
-D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \
-D PYTHON3_LIBRARY=${python_root}/lib/libpython3.6m.dylib \
-D PYTHON3_PACKAGES_PATH=$VIRTUAL_ENV/lib/python3.6/site-packages \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_text=OFF ..
在跑完 cmake
的指令後,請務必確認圖片中的畫面,除了作者提到的 3 點:
1. The Interpreter points to the Python binary in your cv virtual environment.
2. Libraries points to your libpython3.5.dylib file.
3. The numpy version being utilized is the one you installed in your cv virtual environment.
也請存下其中的 install path
,我們之後會用到。
繼續執行 Step #8。
Step #9
由於我們不是使用系統預設的 python
,因此這邊找尋 .so
的路徑和作者的會有點不同。在 Step #7 中顯示的 install path
是:
~/.virtualenvs/cv/lib/python3.6/site-packages/cv2/python-3.6
所以這邊的作法是:
$ cd ~/.virtualenvs/cv/lib/python3.6/site-packages/cv2/python-3.6
$ ls -l *.so
-rwxr-xr-x 1 root admin 8043600 5 18 15:09 cv2.cpython-36m-darwin.so
在這個路徑中,我才能夠正確地找到 .so
,並且更改檔名。
(注意其中的 -36m
,數字有可能會和你的不同,取決於使用的版本)
改名的原因可以參見原作者的講解。
$ mv cv2.cpython-36m-darwin.so cv2.so
$ cd ~
最後,將我們安裝的 opencv3
連結到虛擬環境,這邊也要注意路徑。
$ cd ~/.virtualenvs/cv/lib/python3.6/site-packages/
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.so cv2.so
$ cd ~
最後,終於可以確認自己是否安裝成功啦。
參考資料
- https://blog.x007007007.info/2018/10/21/macxiayongpyenvopencvdajianopencvhuanjing/
- https://blog.aweimeow.tw/use-pyenv-pipenv-to-archieve-clean-environment/
- https://lisupy.github.io/2018/10/01/2018-10-01-Mojave%E4%BD%BF%E7%94%A8pyenv%E5%AE%89%E8%A3%85python/#%E8%B5%B7%E5%9B%A0
- https://www.pyimagesearch.com/2016/12/05/macos-install-opencv-3-and-python-3-5/