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. ..
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()
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é.
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.
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