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