Je travaille à temps partiel chez ALBERT Co., Ltd. Je n'ai jamais posté sur Qiita auparavant, mais je le posterai pour la première fois.
Lors de l'analyse de données, etc., je lis souvent des images avec Python et j'effectue un traitement simple, donc j'aimerais OpenCV. La plupart des gens le feraient avec Anaconda, mais personnellement, je ne veux pas quitter l'écosystème Python, et j'aimerais spécifier les bibliothèques avec lesquelles établir un lien.
C'est pourquoi vous construisez OpenCV. Je pense qu'il y a des explications sur la façon de le construire, donc je vais l'omettre. Cela créera un fichier tel que cv2. D'une manière ou d'une autre .so
en tant que module Python. Pour l'installer globalement, faites simplement make install
.
Cependant, à partir de l'environnement créé avec virtualenv
(ou venv
), ce module cv2
ne peut pas être vu à moins que --system-site-packages
soit ajouté. Si je copie en quelque sorte cv2.so
sur site-packages
dans l'environnement virtualenv
, cela fonctionne, mais ce n'est tout simplement pas cool.
Alors je me suis demandé si je pouvais transformer cela en roue.
Ce que je veux vraiment faire, c'est "Je veux faire une extension pré-intégrée dans une roue", mais cela ne semble pas être pris en charge.
Par conséquent, j'ai fait beaucoup d'erreurs, mais j'ai réussi à le faire. Je faisais principalement référence
Il ya trois.
Tout d'abord, la structure des répertoires est la suivante.
--+-- cv2 --+-- _native --+-- cv2.en quelque sorte.so
| | |
| | +-- __init__.py
| |
| +-- __init__.py
|
+-- setup.py
|
+-- MANIFEST.in
Dans __init __. Py
directement sous le répertoire cv2
import * from _native.cv2
Écrire.
Le __init __. Py
sous le répertoire _native
peut être vide.
setup.py
est comme suit
from setuptools import setup
from setuptools.dist import Distribution
class BinaryDistribution(Distribution):
def has_ext_modules(foo):
return True
setup(
name='cv2',
version='1.0',
packages=['cv2'],
include_package_data=True,
distclass=BinaryDistribution,
)
De plus, MANIFEST.in
est
include cv2/_native/cv2.en quelque sorte.so
Écrire.
Maintenant, lorsque vous exécutez python setup.py bdist_wheel
, vous aurez une roue avec un nom de fichier comme cv2-1.0-cp36-cp36m-linux_x86_64.whl
sous dist
. Je suis heureux.
Tout ce que vous avez à faire est de créer un package factice et d'exporter toutes les définitions dans le module d'origine cv2
. Je voudrais cacher le module d'origine cv2
pour le moment, mais si je renommecv2. D'une manière ou d'une autre .so
en _cv2. D'une manière ou d'une autre .so
, cela ne fonctionnera pas, alors je l'ai résolu en le mettant dans un autre package. fait.
En vous disant de force que l'extension est incluse en définissant has_ext_modules = True
, vous pouvez faire la roue pour que l'installation soit rejetée si vous l'amenez sur un autre OS.
numpy
et scipy
ne fonctionneront pas bien à moins que vous ne les compiliez vous-même et ne les liez à une bibliothèque d'opérations matricielles hautes performances, mais il est également pratique de conserver le résultat compilé sous forme de roue. J'écrirai ce détail plus tard.
Recommended Posts