Il existe de nombreux articles qui rendent les bibliothèques écrites en C ++ disponibles à partir de Python en utilisant pybind11, J'ai senti qu'il n'y avait pas beaucoup de discussions sur la façon de publier ce que je faisais.
Dans cet article, je vais décrire la procédure pour créer un référentiel Github qui peut être publié sur la base du modèle cmake_example
officiellement fourni par pybind. Si vous suivez cette procédure jusqu'à la fin, vous disposerez d'un référentiel que les utilisateurs peuvent installer et commencer à utiliser avec seulement quelques commandes.
cmake_example est un modèle officiel configuré pour construire avec CMake. Obtenez ceci en premier.
cd work #Entrez un répertoire de travail approprié
git clone https://github.com/pybind/cmake_example.git
Comment créer un référentiel est omis. Supposons que le nom du référentiel soit mylib
. Vous pouvez créer librement .gitignore, mais sachez que vous devrez le combiner avec celui de cmake_example plus tard. Vous pouvez définir public / privé comme vous le souhaitez. Clonez-le si vous le pouvez.
git clone https://github.com/*****/mylib.git
cd mylib
git submodule add -b master https://github.com/pybind/pybind11.git pybind11
Divers téléchargements sont effectués dans le répertoire pybind11 /
et .gitmodules
est généré.
Copiez les fichiers et répertoires requis du répertoire cmake_example /
vers mylib /
. Les éléments minimum requis sont les suivants.
Renommez «LICENSE» en «LICENSE.pybind» et préparez une «LICENCE» distincte pour votre projet. Comme mentionné ci-dessus, pour .gitignore
, fusionnez le vôtre avec cmake_example.
Changez la partie où cmake_example
est écrit dans votre propre nom de bibliothèque.
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(mylib) <--
add_subdirectory(pybind11)
pybind11_add_module(mylib src/main.cpp) <--
Réécrivez la partie appel setup
en bas avec vos propres informations.
setup.py
setup(
name='mylib', <-
version='1.0.0', <-
author='oreore', <-
author_email='[email protected]', <-
description='HogeHoge', <-
long_description='', <-
ext_modules=[CMakeExtension('mylib')], <-
cmdclass=dict(build_ext=CMakeBuild),
zip_safe=False,
)
Si nécessaire, ajoutez les exigences de la bibliothèque externe à la description comme suit.
...
zip_safe=False,
packages=find_packages(),
install_requires=['pillow']
Réécrivez le nom de la bibliothèque en mylib
à la spécification de PYBIND11_MODULE
dans main.cpp
.
PYBIND11_MODULE(mylib, m) {
Après cela, créez le code comme vous le souhaitez et ajoutez-le à CMakeLists.txt
si nécessaire.
python setup.py build
OK s'il n'y a pas d'erreur
python setup.py install
Sortez du répertoire mylib /
, démarrez python, importez la bibliothèque et vérifiez l'opération. Si vous archivez mylib /
, il est possible que le fichier sous le répertoire courant soit utilisé à la place du fichier installé en raison de l'influence de l'ordre de recherche des fichiers, alors faites-le à l'extérieur.
>>> import mylib
>>> mylib.add(1, 2)
>>> 3
Pour inciter les utilisateurs à utiliser ce que vous avez créé, procédez comme suit.
Dans le cas d'Ubuntu, etc.
sudo apt install build-essential cmake
Vous devez juste le frapper. Si vous êtes un utilisateur Windows ..., faites de votre mieux pour que Visual Studio 2019 et CMake soient installés séparément (vous devez également faire suivre à CMake le chemin, ce qui est douloureux).
Demandez à l'utilisateur d'exécuter la commande suivante lors du clonage du référentiel.
git clone --recursive https://github.com/******/mylib.git
Si vous n'ajoutez pas --recursive
, pybind11
ne sera pas téléchargé et vous ne pourrez pas le construire, alors décrivez-le correctement.
python setup.py install
Je t'ai frappé. c'est tout.
Si vous souhaitez fournir non seulement la bibliothèque C ++ mais également le code Python, changez le nom de la bibliothèque C ++ en _mylib
et chargez-le comme import depuis mylib / __ init __. Py
.
Spécifiquement, commencez par créer CMakeLists.txt
comme suit.
CMakeLists.txt
project(_mylib)
...
pybind11_add_module(_mylib src/main.cpp)
Puis setup.py
setup.py
ext_modules=[CMakeExtension('mylib._mylib')],
Cela signifie mettre les artefacts de construction dans mylib / _mylib ****
(.so ou .pyd).
Puis src / main.cpp
src/main.cpp
PYBIND11_MODULE(_mylib, m) {
Enfin, préparez le répertoire mylib /
dans lequel le code source Python est placé et écrivez __init __. Py
.
mylib/__init__.py
from ._mylib import *
Ajoutez ensuite le code Python comme vous le souhaitez.
Puisque j'utilise CMake, je vais générer un fichier de solution pour Visual Studio.
Créez un répertoire build /
et exécutez cmake dedans.
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019"
Puisque build / mylib.sln
est généré, développez en utilisant ceci. Le répertoire build /
est inclus dans .gitignore
, donc si vous voulez enregistrer des fichiers de solution etc. dans le référentiel, utilisez un répertoire différent au lieu de build
.
Recommended Posts