Es besteht kein Zweifel, dass Numpy, führt eine riesige Menge an Aufgaben ? Tatsächlich sind Bibliotheken wie Numpy nicht vollständig in Python geschrieben, einige Teile der Bibliothek sind in C geschrieben, was eine bessere Leistung bietet. Nachdem wir den C-Code geschrieben haben, verpacken wir sie in Python-Code, der als Schnittstelle für diese C-Codes dient. Wir können dann C-Funktionen mit Python-Syntax aufrufen, wobei die eigentliche Verarbeitung in C hinter den Kulissen erfolgt und das Ergebnis als Python-Objekt zurückgegeben wird. In diesem Artikel werden wir sehen, wie man einen Python-Wrapper für unser C-Programm auf Linux-Systemen mit SWIG -Software erstellt.
Was ist SWIG >
Kurz gesagt, SWIG — Es ist ein Compiler, der C/C++-Deklarationen akzeptiert und umschließt, um auf diese Deklarationen aus anderen Sprachen wie Python, Tcl, Ruby usw. zuzugreifen.
Normalerweise erfordert dies keine Änderungen am bestehenden Code und erstellt eine Schnittstelle innerhalb einer Minute.
Gründe für das Erstellen eines Wrappers
In vielen Fällen benötigen wir Wrapper, die folgenden sind —
- Aufbau einer interpretierten Schnittstelle für bestehende C-Programme.
- Hochleistungs-C-Module für Skriptsprachen erstellen
- Das Testen riesiger C-Programme ist sehr schwierig, daher schreiben wir Wrapper in einigen Skriptsprachen wie Python, wo es möglich ist ist sehr einfach, Tests zu schreiben. etc
Installieren von SWIG
Um SWIG direkt aus dem apt-Repository herunterzuladen, geben Sie die folgenden Befehle ein —
sudo apt-get update sudo apt-get install swig
Schreiben eines Wrappers mit SWIG
Lassen Sie uns einen Blick darauf werfen dieses Stück Code in C mit zwei Funktionen und einer globalen Variablen —
/ * file: gfg.c * /
# include "stdio.h >
# include "math.h >
// unsere Header-Datei
# include "gfg.h"
# definiere ll long long
double
myvar = 3,4;
// Fakultät berechnen
ll
int
fact (ll
int
n)
{
if
(n "= 1)
return
1;
sonst
return
(n * fact (n-1));
}
// Mod finden
int
my_mod (
int
n,
int
m )
{
return
(n% m);
}
Hier ist unsere Header-Datei — ;
long
long
int
fact (
long
long
int
n);
int
my_mod (
int
n,
int
m);
Zuerst müssen wir die SWIG-Schnittstellendatei erstellen. Diese Datei enthält Prototypen von ANSI-C-Funktionen und Variablendeklarationen. Hier —
- Die Direktive % module gibt den Namen des Moduls an, das wir in Python verwenden werden.
- % {. . % } bietet einen Platz zum Einfügen von zusätzlichem Code, wie z. B. C-Header-Dateien oder zusätzliche C-Deklarationen, in den generierten Wrapper-Code.
- Die Direktive % include ermöglicht es uns, zusätzliche Dateien wie Header-Dateien einzuschließen.
/ * file: gfg.i * /
/ * Name des verwendeten Moduls * /
% module gfg
% {
/ * Alles in dieser Datei wird in die
kopiert Wrapper-Datei. Fügen Sie die erforderliche C-Header-Datei hinzu
kompilieren Sie die Schnittstelle * /
# include "gfg.h"
/ * Variablendeklaration * /
double
myvar;
%}
/ * Funktionen und Variablen explizit auflisten für Interaktion * /
double
myvar;
long
long
int
fact (
long
long
int
n1);
int
my_mod (
int
m,
int
n);
/ * oder wenn wir alle Funktionen verknüpfen wollen, dann können wir einfach
fügen Sie eine Header-Datei wie diese ein -
% include & quot; gfg.h & Quot;
* /
Jetzt erstellen wir den Wrapper-Code mit einem Befehl wie
$ swig -python gfg.i
Dieser Befehl generiert Wrapper-Code namens "gfg_wrap.c" . Diese Dateien enthalten eine aufgeblähte Version unseres C-Quellcodes mit unterschiedlichem Fehlerbehandlungscode usw. Generiert eine weitere Datei "gfg.py", , die das Modul ist, das wir in unsere importieren Python-Skript.
Danach müssen wir positionsunabhängigen Code generieren, der in der gemeinsam genutzten Bibliothek verwendet werden soll, indem wir "gfg_wrap.c" und "gfg .c" mit folgendem Befehl:
$ gcc -c -fpic gfg_wrap.c gfg.c -I / use / include / python2.7
python2 ersetzen .7 mit Ihrer Python-Version. Dadurch werden zwei Objektdateien
"Gfg_wrap.o‚" und "gfg.o‚" erstellt. Generieren Sie im obigen Befehl —
- positionsunabhängigen Code (PIC), der für die Verwendung in der gemeinsam genutzten Bibliothek geeignet ist, sofern dies für den Zielcomputer unterstützt wird. Dieser Code greift über die Global Offset Table (GOT) auf alle permanenten Adressen zu
Hinweis: Wenn Sie eine Fehlermeldung wie die folgenden möglichen Ursachen erhalten —
- Möglicherweise haben Sie nicht die ' Python.h ' oder
- Sie geben den falschen Standort für das ' Python.h ' für den Compiler
Um ' Python.h ' Sie müssen Python-dev, mit dem folgenden Befehl installieren —
$ sudo apt-get install python-dev
Um den korrekten Pfad zu Python.h zu finden, führen Sie den folgenden Befehl aus —
$ python -config --cflags
Dies wird so etwas ausgeben —

Ersetzen Sie nun den Pfad im Kompilierbefehl durch diesen für python2.7 oder ändern Sie die Version in python3.5 für Python 3.5 .
Jetzt müssen wir endlich die generierten Objektdateien miteinander verknüpfen, um ein gemeinsam genutztes Objekt zu erstellen, das den DLL -Dateien unter Windows ähnelt. Verwenden Sie den folgenden Befehl. Dadurch wird eine gemeinsam genutzte Objektdatei "_gfg.so" —
$ gcc -shared gfg.o gfg_wrap.o -o _gfg.so generiert
Wir sind jetzt bereit, die Python-Shell zu testen, indem wir sie importieren. Stellen Sie sicher, dass Sie sich im Verzeichnis mit dieser Shell-Datei befinden.
> > > gfg importieren > > > res = Tatsache (5) > > > Auflösung 120 > > > res = my_mod (5,2) > > > Auflösung 1 > > > gfg.cvar.myvar 3.4
Hier sind C-Variablen verfügbar als.
Compiling and link using distutils
< / p>
Anstatt Befehle einzugeben und herauszufinden, welche Kompilierungsoptionen zum Kompilieren von Dateien erforderlich sind, können wir dies mit distutils automatisieren. Erstellen Sie wie unten gezeigt —
Schreiben Sie nun die folgenden Befehle zum Kompilieren und Installieren des Moduls — $ python setup.py build_ext --inplace Das sollte so aussehen wie do etwas in der Art auf dem Terminal — ![]() Mögliche Alternativen Offensichtlich ist SWIG — nicht die einzige Möglichkeit, Wrapper zu erstellen, könnten die folgenden Alternativen basierend auf ihren Anforderungen in Betracht gezogen werden —
Im nächsten Artikel werden wir sehen, wie man C++ (OPP) Code umschließt Links Dieser Artikel mit freundlicher Genehmigung von Atul Kumar . Wenn Sie Python.Engineering sind und einen Beitrag leisten möchten, können Sie auch einen Artikel schreiben, indem Sie Contribute.python.engineering verwenden oder einen Artikel posten Tragen Sie bei @ python.engineering bei. Sehen Sie sich meinen Artikel an, der auf der Python.Engineering-Homepage erscheint, und helfen Sie anderen Geeks. Bitte posten Sie Kommentare, wenn Sie etwas falsch finden oder wenn Sie weitere Informationen zu dem besprochenen Thema teilen möchten oben. ShopLatest questions Wiki |