"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung

Überblick

Ich möchte den in ** C ++ ** geschriebenen Code in eine Bibliothek verwandeln, die von ** Python ** aufgerufen werden kann. Es gab jedoch eine große Mauer namens Cython.

Dies ist eine Fortsetzung von "Cython" -Tutorial, um Python explosiv zu machen: Grundkonfiguration.

Dieses Mal werde ich erklären, wie man cythonisiert, wenn der C ++ - Code, den Sie cythonisieren möchten, von einer C ++ - Bibliothek abhängt. Diesmal ist die Vorbereitung.

Der Code ist unter "github hier" aufgeführt. Schauen Sie also bitte vorbei.

Dazu müssen Sie `` `setup.py``` bearbeiten, aber es ist einfacher, wenn Sie Cython einmal verlassen und verstehen, wie CMakeLists.txt geschrieben wird, damit C ++ überhaupt kompiliert werden kann. ..

Situationserklärung

Ich habe den Namen ein wenig von der vorherigen Ordnerstruktur geändert.

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

Wenn Sie mit einer Überprüfung beginnen

setup.py Ist eine Datei zum Kompilieren von C ++ - und Cython-Code zum Erstellen einer Objektdatei für die Bibliothek. Auf diese Weise können Sie my_libarary aus Python importieren.

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 In dem Ordner befinden sich Bibliotheken, die in meinem C ++ geschrieben sind. Der Zweck ist, diese `` `TestClass1.cpp, TestClass1.h``` Cython so zu machen, dass sie von Python aus aufgerufen werden kann.

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 In dem Ordner wird der Code zum Konvertieren der in C ++ geschriebenen Bibliothek nach Cython gespeichert. Die `` pxd```-Datei ist wie eine C ++ - Header-Datei, und die `pyx``` ist wie eine cpp-Datei.

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

Nachdem Sie das oben genannte vorbereitet haben, kompilieren Sie

 python setup.py install

Machen. tatsächlich,

(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

Lassen Sie uns bestätigen, dass die Cythonisierung abgeschlossen ist.

cpp_library hängt von einer C ++ - Bibliothek ab.

In dieser Situation werden Sie wahrscheinlich auf das Problem stoßen, wie setup.py geschrieben wird, das cythonisiert. Nehmen wir diesmal an, dass ein in C ++ geschriebenes Programm von der gmp-Bibliothek als Beispiel abhängt. gmp Bibliothek

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

Sie können mit kompilieren.

Diesmal bin ich so weit bereit, also weiter

Ich werde es gerne versuchen.

Zusammenfassung

Wenn ich C ++ zu einer Bibliothek machen möchte, die mit cython aus Python aufgerufen werden kann, möchte ich eine geeignete setup.py in einer Situation schreiben, in der die C ++ - Seite von der Bibliothek abhängt. Ich bin bereit dafür.

Ende.

Recommended Posts

"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Schreiben Sie setup.py.
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.
"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil ①
"Cython" Tutorial, um Python explosiv zu machen: Grundkonfiguration
"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.
Verwendung der C-Bibliothek in Python
Ich möchte C ++ - Code aus Python-Code erstellen!
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Führen Sie Python-Code unter C ++ aus (mit Boost.Python).
Umgang mit "^ [[A ^ [[B ^ [[C ^ [[D"]] beim Drücken der Richtungstaste beim Ausführen von Python auf dem Mac
Stellen Sie die von Eigen of C ++ erstellte Bibliothek mit Boost.Numpy in Python zur Verfügung.
Wenn Sie die Python-Bibliothek nicht deinstallieren können. 'Hogehoge' kann nicht deinstalliert werden. Es wurden keine Dateien zum Deinstallieren gefunden.
Hinweis zur Codierung bei LANG = C in Python
Probieren Sie CI den Push-Python-Code auf GitHub aus.
Einführung in Python mit Atom (unterwegs)
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Übergeben von Argumenten beim Aufrufen von Python-Skripten über Blender in der Befehlszeile
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Schritte zum Installieren des neuesten Python auf Ihrem Mac
Installieren Sie die Python-Bibliothek eines Drittanbieters auf Cinema4D
Ich wollte die Python-Bibliothek von MATLAB verwenden
[Python] Verwendung der Diagrammerstellungsbibliothek Altair
So erstellen Sie ein Python-Paket mit VS Code
Python Gibt die Funktion an, die ausgeführt werden soll, wenn das Programm endet
Informationen zur Option --enable-shared beim Erstellen von Python unter Linux
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib