"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2

Überblick

Ich möchte in C ++ geschriebenen Code zu einer Bibliothek machen, die in Python aufgerufen werden kann. Es gab jedoch eine große Mauer namens Cython.

Dies ist ein "Cython" -Tutorial, das Python explosiv macht: Übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Es ist eine Fortsetzung davon ①.

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

Letztes Mal habe ich erklärt, dass beim Konvertieren einer in C ++ geschriebenen Bibliothek nach Cython, damit sie von Python aus verwendet werden kann, der in C ++ deklarierte Typ an die Python-Seite übergeben wird.

Es stellte sich heraus, dass wenn Sie int oder double selbst oder einen Vektor übergeben, der sie als Elemente enthält, dieser auf der Python-Seite in einen geeigneten Typ konvertiert wird.

Dieses Mal werde ich erklären, wie Sie ein Objekt einer von Ihnen in C ++ - Code definierten Klasse an die Python-Seite zurückgeben.

Situationserklärung

Ich habe eine neue `TestClass2``` wie diese zum Testen erstellt. Die Konfiguration ist so, dass TestClass1``` das Objekt TestClass2``` als Eigenschaft hat. Um diese Eigenschaft zu erhalten, bereiten Sie einen Konstruktor vor, der `` getter und` `setter, TestClass2, empfängt.

cpp_library/TestClass2.h


namespace my_library
{
class TestClass2{
    private:
        int property_int;
    public:
        TestClass2(){};

};    
} // namespace my_library

cpp_library/TestClass2.cpp



cpp_library/TestClass1.h


#pragma once
#include <gmp.h>
#include <vector>
#include "TestClass2.h"

using namespace std;

namespace my_library
{
class TestClass1{
    private:
        TestClass2 property_test_class2;
    public:
        //Kürzung
        TestClass1(TestClass2 test_class2);
        TestClass2 get_property_test_class2();
};    
} // namespace my_library

cpp_library/TestClass1.cpp


//Kürzung
TestClass1::TestClass1(){
    this->property_test_class2 = TestClass2();
}

TestClass1::TestClass1(TestClass2 test_class2){
    this->property_test_class2 = test_class2;
}

TestClass2 TestClass1::get_property_test_class2(){
    return this->property_test_class2;
}

void TestClass1::set_property_test_class2(TestClass2 test_class2){
    this->property_test_class2 = test_class2;
}

Wie erhalte ich TestClass2 in Python?

Definieren Sie eine Wrapper-Klasse für Pyhton auf der Cython-Seite und übergeben Sie sie an diese.

Die Implementierung sieht so aus.

testclass2cython Ist testclass2Es ist eine Wrapper-Klasse zum Übergeben an Python entsprechend.

cython/test_class2.pxd


cdef extern from "../cpp_library/TestClass2.h" namespace "my_library":
    cdef cppclass TestClass2:
        TestClass2()

cython/test_class2.pyx


cdef class TestClass2Cython:
    cdef TestClass2* ptr

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

    def __deadaloc(self):
        del self.ptr

cython/test_class1.pxd


from libcpp.vector cimport vector	
from libcpp.string cimport string

from test_class2 cimport *

cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        TestClass1()
        TestClass1(TestClass2 test_class2)
        void test_function1()
        void gmp_print_test()
        int test_sum(int x, int y)
        double test_sum_double(double x, double y)
        vector[int] test_vector_int(vector[int] x, int y)

        void set_property_test_class2(TestClass2 test_class2)
        TestClass2 get_property_test_class2()

Das Wichtigste hier ist

--Deklarieren Sie das Klassenobjekt auf der C ++ - Seite als `` `cdef TestClass2 cpp_test_class2``` und

Hier wird `test_class2.ptr``` in test_class2.pyx als` cdef TestClass2 * ptr``` definiert, und `self.ptr [0]` ist ein C ++ - Klassenobjekt. Bedeutet die Substanz von. Da `get_property_test_class2 ()` auf der C ++ - Seite die Substanz des Klassenobjekts von TestClass2 zurückgab, musste es als self.ptr [0] festgelegt werden.

cython/test_class2.pyx


    def get_property_test_class2(self):
        cdef:
            TestClass2 cpp_test_class2
        
        test_class2 = TestClass2Cython()
        cpp_test_class2 = self.ptr.get_property_test_class2()
        test_class2.ptr[0] = cpp_test_class2
        return test_class2

Wie üblich nach dem Kompilieren mit `` `python setup.py install```

(myenv) root@e96f489c2395:/from_local# python 
Python 3.6.3 (default, Jan 30 2020, 06:37:54) 
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_library
>>> test = my_library.test()
>>> test.get_property_test_class2()
<my_library.TestClass2Cython object at 0x7f776003d240>

Es kann bestätigt werden, dass die `TestClass2``` von der C ++ - Seite an die` `TestClass2Cython übergeben wird und von der Python-Seite erkannt werden kann.

Zusammenfassung

Für die auf der C ++ - Seite definierten Objekte der Klasse wurde festgestellt, dass die empfangende Klasse auf der Cython-Seite definiert und der Rückgabewert der Funktion in diesen Typ konvertiert und zurückgegeben werden muss.

Es ist natürlich, das zu sagen, aber es ist überraschend schwierig, also hoffe ich, dass es hilft.

Als nächstes möchte ich erklären, wie ein Klassenobjekt auf der Python-Seite entgegen dieser Zeit über Cython an C ++ übergeben wird.

Diesmal hier.

Ende.

Recommended Posts

"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2
"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: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
"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: Grundkonfiguration
"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Einführung in Python Hands On Teil 1
[Python + Heroku] Vom Zustand ohne Python zur Anzeige von etwas mit Heroku (Teil 2)
[Python] Wie man eine Klasse iterierbar macht
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 1).
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 3).
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 2).
Python C / C ++ - Erweiterung: Übergeben Sie einen Teil der Daten als np.array an Python (Schritt setzen)
Verwendung der C-Bibliothek in Python
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Einführung in Python mit Atom (unterwegs)
Ich möchte C ++ - Code aus Python-Code erstellen!
Übergeben von Argumenten beim Aufrufen von Python-Skripten über Blender in der Befehlszeile
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Schritte zum Installieren des neuesten Python auf Ihrem Mac
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
Lesen Sie die XML-Datei anhand des Python-Tutorials
Konvertieren / Zurückgeben von Klassenobjekten in das JSON-Format in Python
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
Übergeben Sie sich in der Klasse nicht an ProcessPoolExecutor
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert