"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.

Ü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 das "Cython" -Tutorial, das Python explosiv macht: Wenn eine Funktion auf der C ++ - Seite überlastet ist. Dies ist eine Fortsetzung von.

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

Letztes Mal habe ich Cythonization erklärt, wenn eine Funktion auf der C ++ - Seite überladen ist (wenn die Konfiguration denselben Funktionsnamen, aber unterschiedliche Argumente hat).

Dieses Mal möchte ich erklären, wie C ++ - Funktionen auf der Cython-Seite behandelt werden, wenn Referenz übergeben wird, anstatt Wert als Argument zu übergeben. Es gibt nicht viel Neues, aber wenn Sie tatsächlich versuchen, Cython zu schreiben, ärgern Sie sich oft über Fehler. Schauen Sie sich das also unbedingt an! !!

Situationserklärung

Ich werde es tatsächlich versuchen.

cpp_library/TestClass1.h


class TestClass1{
    private:
        TestClass2 property_test_class2;
        EnumForTestClass1 group;

    public:
        //~Kürzung
        static void print_vector(vector<int> &x);
        static void print_vector(vector<double> &x);

Der Unterschied zum letzten Mal besteht darin, dass das Argument `x``` von` print_vector``` von ** nach Wert in übergeben als Referenz ** geändert wird.

cpp_library/TestClass1.cpp


void TestClass1::print_vector(vector<int> &x){
    for(int i=0; i<x.size(); i++){
        cout << x[i] << " ";
    }
    cout << endl;
}

void TestClass1::print_vector(vector<double> &x){
    for(int i=0; i<x.size(); i++){
        cout << x[i] << " ";
    }
    cout << endl;
}

Wenn ich versuche, dies wie gewohnt mit `` `python setup.py install``` zu erstellen, wird folgende Fehlermeldung angezeigt:


./cython/my_library.cpp:2414:69: error: cannot bind non-const lvalue reference of type 'std::vector<int>&' to an rvalue of type 'std::vector<int>'
     __pyx_t_1 = __Pyx_void_to_None(__pyx_v_testclass1.print_vector(((std::vector<int> )__pyx_t_4))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)

Die Besetzung sollte ordentlich sein, aber ich werde wütend, wenn es darum geht, als Referenz zu gelten.

Also als Lösung

Erstellen Sie die Entität vor Ort, nicht die Besetzung.

Was bedeutet das?

cython/test_class1.pyx


    @staticmethod
    def print_vector(list x):
        cdef:
            TestClass1 testclass1
            vector[int] vec_int
            vector[double] vec_double
        
        if isinstance(x[0], int):
            vec_int.resize(len(x))
            for i in range(len(x)):
                vec_int[i] = <int>x[i]
            return testclass1.print_vector(vec_int)
        elif isinstance(x[0], float):
            vec_double.resize(len(x))
            for i in range(len(x)):
                vec_double[i] = <double>x[i]
            return testclass1.print_vector(vec_double)
        else:
            raise Exception('TypeError')

Wird besorgt. Erstellen Sie nun mit `cdef``` im laufenden Betrieb` vector [int] `und` vector [double] `` `und übergeben Sie es an die Funktion. Vielleicht wird der Fehler, den ich gerade bekommen habe, als Referenz übergeben, aber ich weiß nicht, ob er wirklich existiert! Mach dir keine Sorgen! !! !! Ich interpretiere, dass es ein Fehler war.

Daher ist es gut, die Substanz vorzubereiten und zu beruhigen.

Dann wird wie üblich `python setup.py install `den Build bestehen.

Schreiben Sie dazu den Testcode wie folgt:

test.py


import my_library as myl

if __name__ == "__main__":

    cl1 = myl.test()
    x = [1,2,3]
    y = [1.1, 2.2, 3.3]
    cl1.print_vector(x)
    cl1.print_vector(y)

Ich konnte die Funktion richtig aufrufen.

(myenv) root@e96f489c2395:/from_local/cython_practice# python test.py 
1 2 3 
1.1 2.2 3.3 

Zusammenfassung

Dieses Mal habe ich erklärt, wie die Funktion auf der C ++ - Seite beim Übergeben als Referenz behandelt wird, anstatt als Wert auf der Cython-Seite als Wert zu übergeben.

Diesmal.

Ende.

Recommended Posts

"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
"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 ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil ①
"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, 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
[Python] Stellen Sie sicher, dass die empfangene Funktion eine benutzerdefinierte Funktion ist
Verwenden Sie AWS Lambda, um einen Mechanismus zu erstellen, der Slack benachrichtigt, wenn der von CloudWatch überwachte Wert in Python überschritten wird
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erweiterung von Python um C oder C ++ (wenn es mehrere Argumente gibt, wenn eine Liste von der Python-Seite übergeben wird)
python So benachrichtigen Sie automatisch per Telefon, wenn das System ausfällt
Umgang mit "^ [[A ^ [[B ^ [[C ^ [[D"]] beim Drücken der Richtungstaste beim Ausführen von Python auf dem Mac
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Machen wir einen Sprung in die Fertigungsindustrie, indem wir zusätzlich zu Python das Web nutzen
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Lesen Sie die XML-Datei anhand des Python-Tutorials
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
[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, eine RESTful-API zu erstellen, indem ich die explosive Fast-API des Python-Frameworks mit MySQL verbunden habe.
Slack-Benachrichtigung, wenn ein bestimmtes Wort auf Twitter mit Heroku mit Python gemurmelt wird
Problemumgehung für sys.argv wird nicht übergeben, wenn ein Python-Skript mit nur dem Dateinamen unter Python2.7 unter Windows ausgeführt wird
Endlich ... Erstellen Sie einen Funkcontroller mit Python auf Raspberry Pi 3! (Wenn der Magnet näher gebracht wird, bewegt sich der Motor und stoppt automatisch)
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Wenn Sie einen UNIX-Befehl in Python ausführen möchten
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Wie einfach ist es, ein Medikament auf dem Markt zu synthetisieren?
[Python] Ausführungszeit, wenn eine Funktion in einen Wörterbuchwert eingegeben wird
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Erstellen einer Python-Umgebung unter Ubuntu (wenn pip nicht die Standardeinstellung war)
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Endlich ... Erstellen Sie einen Funkcontroller mit Python auf Raspberry Pi 3! (Der Motor bewegt sich, während die Taste gedrückt wird.)