C/C++-Packaging für Python mit SWIG — Set 1

| | | | | | | | | | |

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 —


# Datei: setup.py


from distutils.core import setup, Extension

# Modulname

name = "gfg"


# Modulversion

version = "1.0"


# Erweiterungsnamen und Quelldateien angeben
# für Kompilierung erforderlich

ext_modules = Extension (name = ’_gfg’ , sources = [ " gfg.i " , " gfg.c " ] )


einrichten (name = name,

version = Version,

ext_modules = [ext_modules])

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.

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method