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! !!
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
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
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