SWIG — Set 1 Kullanan Python için C / C++ Paketleme

| | | | | | | | | | |

Şüphesiz ki Numpy, çok büyük miktarda görevler ? Aslında Numpy gibi kütüphaneler tamamen Python ile yazılmaz, kütüphanenin bazı bölümleri C ile yazılır, bu da daha iyi performans sağlar. C kodunu yazdıktan sonra bunları Python koduna sarıyoruz ve bu C kodları için arayüz görevi görüyor. Daha sonra Python sözdizimini kullanarak C işlevlerini çağırabiliriz, burada gerçek işleme sahne arkasında C`de yapılır ve sonuç bir Python nesnesi olarak geri döndürülür. Bu yazıda, SWIG yazılımını kullanarak Linux sistemlerinde C programımız için bir Python sarmalayıcının nasıl oluşturulacağını göreceğiz.

SWIG Nedir

Özetle, SWIG — C / C++ bildirimlerini kabul eden ve Python, Tcl, Ruby, vb. gibi diğer dillerden bu bildirimlere erişmek için onu saran bir derleyicidir.
Genellikle bu, mevcut kodda herhangi bir değişiklik gerektirmez ve bir arayüz oluşturur. bir dakika içinde.

Bir sarmalayıcı oluşturma nedenleri

Birçok durumda sarmalayıcılara ihtiyacımız var, aşağıdakiler —

  • Mevcut C programları için yorumlanmış bir arayüz oluşturma.
  • Komut dosyası dilleri için yüksek performanslı C modülleri oluşturmak
  • Büyük C programlarını test etmek çok zordur, bu nedenle bazı komut dosyası dillerinde (Python gibi) sarmalayıcılar yazıyoruz. test yazmak çok kolay. etc

SWIG Kurulumu

SWIG`i doğrudan uygun veri havuzundan indirmek için aşağıdaki komutları girin —

sudo apt-get update sudo apt-get install swig 

SWIG kullanarak Wrapper Yazma

Bir bakalım C`deki bu kod parçası, iki fonksiyon ve bir global değişken —


/ * file: gfg.c * /


# include "stdio.h >
# include "matematik.h >


// başlık dosyamız
# include "gfg.h"
# define ll long long


double myvar = 3.4;


// faktöriyel hesapla

ll int fact (ll int n)

{

if (n "= 1)

return 1;

else

dönüş (n * gerçek (n-1));

}


// modu bulun

int my_mod ( int n, int m )

< kod sınıfı = "düz"> {

dönüş (n% m);

}

İşte başlık dosyamız — ;


long long int fact ( uzun uzun < kod sınıfı = "renk1 kalın"> int n);

int my_mod ( int n, int m);

Önce SWIG arayüz dosyasını oluşturmalıyız. Bu dosya, ANSI C işlevlerinin prototiplerini ve değişken bildirimlerini içerir. Burada —

  • % module yönergesi Python`da kullanacağımız modülün adını belirtir.
  • % {. . % }, oluşturulan sarmalayıcı koduna C başlık dosyaları veya ek C bildirimleri gibi ek kodlar eklemek için bir yer sağlar.
  • % include yönergesi, başlık dosyaları gibi ek dosyaları eklememize olanak tanır.

/ * dosya: gfg.i * /


/ * kullanılan modülün adı * /
% modül gfg
% {

/ * Bu dosyadaki her şey

içine kopyalanır. sarma dosyası. Gerekli C başlık dosyasını ekleyin

arayüzü derleyin * /

# "gfg.h" içerir

/ * değişken bildirimi * /

double myvar;

%}


/ * fonksiyonları ve değişkenleri açıkça listeleyin etkileşim için * /

double myvar;

uzun uzun int olgu ( uzun uzun int n1);

int my_mod ( int m, int n);


/ * veya tüm fonksiyonları bağlamak istiyorsak, o zaman sadece

< yapabiliriz. code class = "comments"> bunun gibi bir başlık dosyası içerir -

% include & quot; gfg.h & quot;

* /

Şimdi sarmalayıcı kodunu oluşturacağız

$ swig -python gfg.i 

Bu komut, "gfg_wrap.c" adlı sarmalayıcı kodu oluşturur. Bu dosyalar, farklı hata işleme kodu vb. ile C kaynağımızın şişirilmiş bir sürümünü içerir. python betiği.


Bundan sonra, paylaşılan kitaplıkta kullanılmak üzere "gfg_wrap.c" ve "gfg`yi derleyerek konumdan bağımsız kod oluşturmamız gerekiyor. .c" aşağıdaki komutla:

$ gcc -c -fpic gfg_wrap.c gfg.c -I / use / include / python2.7 

python2`yi değiştirin .7 Python sürümünüzle. Bu, iki nesne dosyası oluşturacaktır
"Gfg_wrap.o‚" ve "gfg.o‚" . Yukarıdaki komutta —

  • hedef makine için destekleniyorsa, paylaşılan kitaplıkta kullanıma uygun konumdan bağımsız kod (PIC) oluşturun. Bu kod, Global Offset Table (GOT) aracılığıyla tüm kalıcı adreslere erişir

Not: aşağıdaki olası nedenler gibi bir hata mesajı alırsanız —

  • ' Python.h ' veya
  • ' Python.h ' derleyici için

' Python.h ' —

$ sudo apt-get install python-dev 

Python.h`nin doğru yolunu bulmak için aşağıdaki komutu çalıştırın —

$ python -config --cflags 

Bu, şunun gibi bir çıktı verecektir —

Şimdi python2.7 için derleme komutundaki yolu bununla değiştirin veya Python 3.5 için sürümü python3.5 olarak değiştirin .

Son olarak, Windows`taki DLL dosyalarına benzer bir paylaşılan nesne oluşturmak için oluşturulan nesne dosyalarını birbirine bağlamamız gerekiyor. Aşağıdaki komutu kullanın, bu "_gfg.so"

$ gcc -shared gfg.o gfg_wrap.o -o _gfg.so paylaşılan bir nesne dosyası oluşturacaktır. 

Artık Python kabuğunu içe aktararak test etmeye hazırız. Bu kabuk dosyasının bulunduğu dizinde olduğunuzdan emin olun.

> > > gfg`yi içe aktar > > > res = gerçek (5) > > > res 120 > > > res = my_mod (5,2) > > > res 1 > > > gfg.cvar.myvar 3.4 

Burada C değişkenleri şu şekilde mevcuttur.

Distutils kullanarak derleme ve bağlantı oluşturma

< / p>

Komutları yazmak ve dosyaları derlemek için hangi derleme seçeneklerinin gerekli olduğunu bulmak yerine, bunu distutils ile otomatikleştirebiliriz. Aşağıda gösterildiği gibi oluşturun —


# Dosya: setup.py


from distutils.core import kurulum, Uzantı

# modül adı

ad = "gfg"


# modül sürümü

sürüm = "1.0"


# uzantı adını ve kaynak dosyalarını belirtin
Derleme için # gerekli

ext_modules = Uzantı (ad = `_gfg` , kaynaklar = [ " gfg.i " , " gfg.c " ] )


kurulum (ad = ad,

sürüm = sürüm,

ext_modules = [ext_modules])

Şimdi —

$ python setup.py build_ext --inplace 

Modülünü derlemek ve kurmak için aşağıdaki komutları yazın. terminalde buna benzer bir şey —

Olası alternatifler

Açıkçası, SWIG — sarmalayıcı oluşturmanın tek yolu değil, gereksinimlerine göre aşağıdaki alternatifler düşünülebilir —

Sıradaki makalesinde C++ (OPP) kodunun nasıl sarılacağını göreceğiz

Bağlantılar

Bu makale Atul Kumar`ın izniyle /güç> . Python.Engineering iseniz ve katkıda bulunmak istiyorsanız, Contribute.python.engineering kullanarak veya bir makale yayınlayarak da bir makale yazabilirsiniz. katkıda bulunun @ python.engineering.Python.Engineering ana sayfasında görünen makaleme bakın ve diğer meraklılara yardımcı olun.

Yanlış bir şey bulursanız veya tartışılan konu hakkında daha fazla bilgi paylaşmak istiyorsanız lütfen yorum gönderin. yukarıda.

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