概要
この記事でopencvをソースコードからビルドしました。自作のプログラムからimport cv2
はできるのですがopencv-pythonに依存するパッケージをインストールしようとするとopencv-pythonないよって怒られます。site-packagesにシンボリックリンクを貼っただけなので、pip的にはopencvが入ったことにならないのでしょうか?そういえばcmakeでpipの場所を指定しなかったような。
そこで、cv2をラップしたパッケージを作ってみました。import cv2
はできるので、空っぽのopencv-pythonパッケージを作ってごまかすのもありではと思いましたが、せっかくなのでちゃんと(?)ラップしました。
構成
構成は以下のとおりです。
wheel/
├── build # ビルドしたものが出力される
├── cv2 # パッケージ名になる
│ ├── __init__.py # 外にcv2として見せる
│ └── _native
│ ├── cv2.cpython-36m-aarch64-linux-gnu.so # 実体
│ └── __init__.py # 元のcv2をインポートする
├── dist # whlファイルが出力される。これをpip installする
├── MANIFEST.in # 実体を指定する。
└── setup.py # pipの各種設定
各ファイルの中身は以下です。__init__.py
何もわからない。。
setup.py
from setuptools import setup
from setuptools.dist import Distribution
class BinaryDistribution(Distribution):
def has_ext_modules(foo):
return True
long_description = "long description of the wheel"
setup(
name='opencv-python',
packages=['cv2'],
version='3.4.3',
include_package_data=True,
distclass=BinaryDistribution,
author='devmikyom',
description='OpenCV wrapper for Ubuntu 20.04 on raspberry pi 4',
long_description = long_description,
classifiers=[
'Programming Language :: Python :: 3.6'
]
)
MANIFEST:in
include cv2/_native/cv2.cpython-36m-aarch64-linux-gnu.so
wheel/cv2/__init__.py
from ._native.cv2 import *
__version__ = '3.4.3'
wheel/cv2/_native/__init__.py
from .cv2 import *
__init__.py
本当に何もわからない。。
ビルドとインストール
$ python setup.py bdist_wheel
$ pip install dist/opencv_python-3.4.3-cp36-cp36m-linux_aarch64.whl
import cv2
できてpip的にもopencv-pythonとしても見えているようです。これで本当に合っているのかよくわかりませんが…