"Cython" Tutorial, um Python explosiv zu machen: Grundkonfiguration

Ü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 **.

Abhängigkeiten von dunklen Bibliotheken, die eine Umgebung schaffen, die Lust macht, verrückt zu werden. Typkonvertierung, von der ich nicht weiß, was ich tun soll. Dieses Gefühl der Verzweiflung, das mich fragen lässt, ob ich Python, C ++ schreibe oder was ich tue.

Ich habe etwas mehr Zeit, um Cython zu berühren, daher möchte ich es nach und nach zusammenfassen. Ich bin ein Anfänger für Python, C ++ und Cython. Wenn Sie also Fehler haben, lassen Sie es mich bitte wissen.

Inhalt

Dieses Mal werde ich versuchen, ** aus Python als Bibliothek ** sehr einfachen C ++ - Code zu cythonisieren und aufzurufen.

Die minimale ** Ordnerstruktur ** ist wie folgt.

hoge@~/Documents/cython_test> tree .
.
├── cython
│   ├── library_cython.pyx
│   ├── test_library.pxd
│   └── test_library.pyx
├── my_library
│   ├── test.cpp
│   └── test.h
└── setup.py

2 directories, 6 files

setup.py Zuerst musste setup.py die Bibliothek erstellen.

`` `test_library``` ist der Name der Bibliothek, die von Python gelesen werden soll.

Mit anderen Worten, rufen Sie nach dem Erstellen `` `import test_library``` auf.

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(
        "test_library", sources=[
            "./cython/test_library.pyx",
            "./my_library/test.cpp"
        ],
        language="c++"
    )
]

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

In diesem Moment,

    Extension(
        "test_library", sources=[
            "./cython/test_library.pyx",

setup(
    name = "test_library",

Behalten wir die Namen der drei `` `test_library``` bei, die in erscheinen. Ich war hier süchtig danach.

Code auf der c ++ Seite

Erstellen Sie auf der c ++ - Seite eine Klasse namens `TestClass```. Nennen Sie dies von Python über Cython. Der Einfachheit halber verfügt TestClass nur über einen Konstruktor und eine Methode namens test_function1 () ``. Lassen Sie uns zu diesem Zeitpunkt den Namespace ordnungsgemäß anhängen. Ich bin mir nicht sicher warum, aber dies ist bequemer bei der Konvertierung in Cython. Hier lautet der Namespace "my_library".

test.h


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


Schreiben Sie den Inhalt der im Header definierten Funktion. `test_function1 ()` ist nur eine zu druckende Funktion.

test.cpp


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

namespace my_library{

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


}

Code auf der Cython-Seite

Wie Sie in setup.py sehen können, ist `test_library.pyx``` die Haupt-Cython-Datei. Enthält unten `library_cython.pyx```.

test_library.pyx


import cython
cimport cython

include "library_cython.pyx"

def test():
    return TestClassCython()

Die `` `pxd```-Datei ist wie eine Definitionsdatei zum Übergeben der erforderlichen Informationen an test_library.pyx aus c ++. Jetzt müssen wir wirklich neu schreiben, was im c ++ - Header in Form von Cython definiert wurde.

test_library.pxd


cdef extern from "../my_library/test.h" namespace "my_library":
    cdef cppclass TestClass:
        TestClass()
        void test_function1()

In dieser `` `library_cython.pyx``` definieren wir die Python (Cython?) - Klasse, die tatsächlich auf der Python-Seite aufgerufen wird. Das erste Rätsel besteht darin, den Zeiger der in c ++ definierten Klasse als Mitgliedsvariable der Klasse beizubehalten. Der Konstruktor erstellt eine Klasse auf der c ++ - Seite und übergibt ihre Adresse an diese Mitgliedsvariable ptr. Der Destruktor löscht diesen ptr mit del.

Außerdem ruft die Methode test_function1_cython () die intern auf der c ++ - Seite definierte Methode auf, indem sie auf ptr.test_function1 () gesetzt wird.

library_cython.pyx


import cython
cimport cython

cdef class TestClassCython:
    cdef TestClass* ptr

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

    def __deadaloc(self):
        del self.ptr

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

Wenn Sie es bauen können, loben Sie sich.

Wenn das oben genannte fertig ist,


python setup.py install

Wird besorgt. Wenn Sie es erfolgreich erstellen können, geben Sie den Python-Interpreter und ein


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 test_library
>>> a = test_library.test()
>>> a.test_function1_cython()
printed from cpp function
>>> 

Ich würde mich freuen, wenn ich das könnte.

Zusammenfassung

Also habe ich mit cython versucht, eine in c ++ geschriebene Klasse aus Python über eine Bibliothek aufzurufen. Dies ist nur der Anfang, und die Abhängigkeiten können verwirrend werden, beispielsweise wenn eine Bibliothek verwendet wird, die mit c ++ kompiliert werden muss, aber ich möchte für einen etwas dunkleren Fall erneut schreiben.

Wenn Sie es hilfreich finden, freuen wir uns über Ihre Likes und Kommentare! !!

Ende.

Recommended Posts

"Cython" Tutorial, um Python explosiv zu machen: Grundkonfiguration
"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: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil ①
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Schreiben Sie setup.py.
"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
Wie erstelle ich einen Crawler?
[Python Tutorial] Eine einfache Einführung in Python
Tipps, um das Lesen von Python-Hördokumenten zu vereinfachen
[Python] Wie man eine Klasse iterierbar macht
Fraktal zum Erstellen und Spielen mit Python
Python-Tutorial
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
So erstellen Sie das Substance Painter Python-Plugin (Einführung)
Ich möchte C ++ - Code aus Python-Code erstellen!
Wie man Python für Anfänger schneller macht [numpy]
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
Lark grundlegende Erklärung (machen Sie einen Shell-ähnlichen Kerl mit Python, Lark)
[Einführung in Python] Grundlegende Verwendung von Lambda-Ausdrücken
Auf Python 2.7.9 aktualisiert
RF Python Basic_01
Python Django Tutorial (5)
Python Django Tutorial (2)
Zusammenfassung des Python-Tutorials
Python-Grundschrift
Grundlegende Grammatik von Python3
RF Python Basic_02
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Python Django Tutorial (3)
"Backport" zu Python 2
Python Django Tutorial (4)
Ein Tool zum Erstellen von Maskenbildern für ETC in Python
Python-Anfänger versucht, dem Administrator von Django eine grundlegende Authentifizierung hinzuzufügen
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Fortsetzung ・ Ich habe versucht, Slackbot zu erstellen, nachdem ich Python3 studiert habe
Lesen Sie die XML-Datei anhand des Python-Tutorials
So erstellen Sie ein Python-Paket mit VS Code
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib