Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Préparation

Aperçu

Je veux faire du code écrit en ** C ++ ** dans une bibliothèque qui peut être appelée par ** Python **. Cependant, il y avait un grand mur appelé Cython.

Ceci est une suite du Tutoriel "Cython" pour rendre Python explosif: configuration de base.

Cette fois, je vais vous expliquer comment cythoniser lorsque le code C ++ que vous souhaitez cythoniser dépend d'une bibliothèque C ++. Cette fois, c'est la préparation.

Le code est répertorié dans "github here", veuillez donc y jeter un œil.

Pour ce faire, vous devez éditer `` setup.py '', mais ce sera plus facile si vous quittez Cython une fois et comprenez comment écrire CMakeLists.txt afin que C ++ puisse être compilé en premier lieu. ..

Explication de la situation

J'ai légèrement changé le nom de la structure de dossiers précédente.

user@~/Documents/cython_practice> tree .
.
├── cpp_library
│   ├── TestClass1.cpp
│   └── TestClass1.h
├── cython
│   ├── my_library.pyx
│   ├── test_class1.pxd
│   └── test_class1.pyx
└── setup.py

2 directories, 6 files

Si vous commencez par un examen

setup.py Est un fichier pour compiler du code C ++ et cython pour créer un fichier objet pour la bibliothèque. En faisant cela, vous pourrez faire import my_libarary depuis python.

setup.py


from setuptools import setup, Extension, find_packages
from Cython.Build import cythonize
from Cython.Distutils import build_ext
from distutils import sysconfig

ext_modules = [
    Extension(
        "my_library", sources=[
            "./cython/my_library.pyx",
            "./cpp_library/TestClass1.cpp"
        ],
        language="c++"
    )
]

setup(
    name = "my_library",
    cmdclass = {"build_ext": build_ext},
    ext_modules= cythonize(ext_modules)
)

cpp_library À l'intérieur du dossier se trouvent des bibliothèques écrites dans mon C ++. Le but est de créer ce Cython `` TestClass1.cpp, TestClass1.h '' afin qu'il puisse être appelé depuis Python.

TestClass1.h


namespace my_library
{
class TestClass1{
    public:
        TestClass1();
        void test_function1();
};    
} // namespace my_library

TestClass1.cpp


#include <iostream>
#include "TestClass1.h"
using namespace std;

namespace my_library{

TestClass1::TestClass1(){};
void TestClass1::test_function1(){
    cout << "printed from cpp function" << endl;
}


}

cython Dans le dossier, le code de conversion de la bibliothèque écrite en C ++ en Cython est stocké. Le fichier pxd est comme un fichier d'en-tête C ++, et le` `` pyx est comme un fichier cpp.

my_library.pxd


cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        TestClass1()
        void test_function1()

my_library.pyx


import cython
cimport cython

include "test_class1.pyx"

def test():
    return TestClass1Cython()

test_class1.pxd


cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        TestClass1()
        void test_function1()

test_class1.pyx


import cython
cimport cython

cdef class TestClass1Cython:
    cdef TestClass1* ptr

    def __cinit__(self):
        self.ptr = new TestClass1()

    def __deadaloc(self):
        del self.ptr

    def test_function1_cython(self):
        self.ptr.test_function1()

Après avoir préparé ce qui précède, compilez

 python setup.py install

Faire. réellement,

(myenv) user@~/Documents/cython_practice> python 
Python 3.6.7 (default, Nov 16 2019, 21:57:19) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_library
>>> test = my_library.test()
>>> test.test_function1_cython()
printed from cpp function

Confirmons que cythonize est terminé.

cpp_library dépend d'une bibliothèque C ++.

Dans cette situation, je pense que vous rencontrerez le problème de l'écriture de setup.py qui cythonise. Cette fois, supposons qu'un programme écrit en C ++ dépend de la bibliothèque gmp à titre d'exemple. bibliothèque gmp

wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz &&\
tar xvf gmp-6.1.2.tar.xz &&\
cd gmp-6.1.2 &&\
./configure --prefix=/usr/local/gmp/6_1_2 &&\
make && make check && make install

Vous pouvez compiler avec.

Cette fois, nous sommes prêts pour l'instant

J'aimerai essayer.

Résumé

Lorsque je veux faire de C ++ une bibliothèque qui peut être appelée à partir de python en utilisant cython, je veux écrire un setup.py approprié dans la situation où le côté C ++ dépend de la bibliothèque. Je suis prêt pour ça.

fin.

Recommended Posts

Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Préparation
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Écrivez setup.py.
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Tout d'abord, CMake.
Tutoriel "Cython" pour rendre Python explosif: Lorsqu'une fonction côté C ++ a une surcharge.
Tutoriel "Cython" pour rendre Python explosif: Passez l'objet de classe C ++ à l'objet de classe côté Python. Partie 2
Tutoriel "Cython" qui rend Python explosif: Gérer le passage de fonctions côté C ++ par référence.
Tutoriel "Cython" pour rendre Python explosif: Passez un objet de classe C ++ à un objet de classe côté Python. Partie ①
Tutoriel "Cython" pour rendre Python explosif: configuration de base
Tutoriel "Cython" pour rendre Python explosif: Comment analyser la classe Enum définie en code C ++ vers Enum en Python.
Comment utiliser la bibliothèque C en Python
Je veux créer du code C ++ à partir de code Python!
Je suis tombé sur un code de caractère lors de la conversion de CSV en JSON avec Python
Faire un point d'arrêt sur la couche c avec python
J'ai senti que j'avais porté le code Python en C ++ 98.
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
Exécuter du code Python sur C ++ (en utilisant Boost.Python)
Comment gérer "^ [[A ^ [[B ^ [[C ^ [[D"]] en appuyant sur la touche de direction lors de l'exécution de python sur mac
Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.
Lorsque vous ne pouvez pas désinstaller la bibliothèque python. Impossible de désinstaller «hogehoge». Aucun fichier à désinstaller n'a été trouvé.
Remarque sur l'encodage lorsque LANG = C en Python
Essayez CI le code python poussé sur GitHub.
Introduction à Python avec Atom (en route)
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
Comment passer des arguments lors de l'appel d'un script python depuis Blender sur la ligne de commande
Essayez de créer un module Python en langage C
Étapes pour installer le dernier Python sur votre Mac
Installez la bibliothèque python tierce sur Cinema4D
Je voulais utiliser la bibliothèque Python de MATLAB
[Python] Comment utiliser la bibliothèque de création de graphes Altair
Comment créer un package Python à l'aide de VS Code
python Spécifie la fonction à exécuter lorsque le programme se termine
À propos de l'option --enable-shared lors de la construction de Python sous Linux
Comment profiter de Python sur Android !! Programmation en déplacement !!
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib