SWIGを使用したPython用のC/C ++パッケージング—セット1

| | | | | | | | | | |

Numpy、は大量のタスク?実際、Numpyのようなライブラリは完全にPythonで記述されているわけではなく、ライブラリの一部はCで記述されているため、パフォーマンスが向上します。 Cコードを記述した後、それらをPythonコードでラップします。Pythonコードは、これらのCコードのインターフェイスとして機能します。次に、Python構文を使用してC関数を呼び出すことができます。実際の処理は、舞台裏でCで行われ、結果はPythonオブジェクトとして返されます。この記事では、 SWIGソフトウェアを使用してLinuxシステムでCプログラムのPythonラッパーを作成する方法を説明します。

SWIGとは

一言で言えば、SWIG—これは、C / C ++宣言を受け入れ、それをラップして、Python、Tcl、Rubyなどの他の言語からの宣言にアクセスするコンパイラです。
通常、これは既存のコードに変更を加える必要がなく、インターフェイスを作成します。 1分以内。

ラッパーを作成する理由

多くの場合、ラッパーが必要です。以下は—です。

  • 既存のCプログラムのインタプリタインターフェイスを構築します。
  • スクリプト言語用の高性能Cモジュールの構築テストを書くのはとても簡単です。など

SWIGのインストール

aptリポジトリからSWIGを直接ダウンロードするには、次のコマンドを入力します—

 sudo apt-get update sudo apt-get install swig 

SWIGを使用したラッパーの作成

を見てみましょう2つの関数と1つのグローバル変数を持つCのこのコード—


/ *ファイル:gfg.c * /


#include< stdio.h>
#include< math.h>


//ヘッダーファイル
#include "gfg.h"
#define ll long long


double myvar = 3.4;


//因数分解を計算します

ll int fact(ll int n)

{

if (n< = 1)

return 1;

else

return (n * fact(n-1));

}


//modを見つける

int my_mod( int n、 int m)

{

return (n%m);

}

これがヘッダーファイルです&#8212 ;


長い長い int fact( long long int n);

int my_mod( int n、 int m);

まず、SWIGインターフェイスファイルを作成する必要があります。このファイルには、ANSIC関数のプロトタイプと変数宣言が含まれています。ここで—

  • %module ディレクティブは、Pythonで使用するモジュールの名前を指定します。
  • %{。 。 %}は、生成されたラッパーコードに、Cヘッダーファイルや追加のC宣言などの追加のコードを挿入する場所を提供します。
  • %include ディレクティブを使用すると、ヘッダーファイルなどの追加ファイルをインクルードできます。

/ *ファイル:gfg.i * /


/*使用するモジュールの名前*/
%module gfg
% {

/*このファイルのすべてのものが

にコピーされますラッパーファイル。必要なCヘッダーファイルをインクルードします

インターフェースをコンパイルします*/

#インクルード"gfg.h"

/*変数宣言* /

double myvar;

%}


/*関数と変数を明示的にリストします対話用*/

double myvar;

long long int fact( long long int n1);

int my_mod( int m、 int n);


/ *または、すべての関数をリンクする場合は、

次のようなヘッダーファイルを含める-

%include" gfg.h"

* /

次に、ラッパーコードを作成します

 $ swig -python gfg.i 

このコマンドは、 "gfg_wrap.c"という名前のラッパーコードを生成します。これらのファイルには、さまざまなエラー処理コードなどを含む肥大化したバージョンのCソースが含まれています。生成された別のファイル"gfg.py"、は、インポートするモジュールです。 pythonスクリプト。


その後、 "gfg_wrap.c" "gfgをコンパイルして、共有ライブラリで使用する位置に依存しないコードを生成する必要があります。 .c"次のコマンドを使用します。

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

python2を置き換えます.7Pythonバージョン。これにより、2つのオブジェクトファイル
"Gfg_wrap.o、""gfg.o、"が作成されます。上記のコマンドで—

  • ターゲットマシンでサポートされている場合、共有ライブラリでの使用に適した位置独立コード(PIC)を生成します。このコードは、グローバルオフセットテーブル(GOT)を介してすべての永続アドレスにアクセスします。

注:次の考えられる原因などのエラーメッセージが表示された場合—

  • 'を持っていない可能性がありますPython.h'または
  • 'に間違った場所を入力していますPython.h'コンパイラの場合

取得するには' Python.h'次のコマンド—を使用して、 Python-dev、をインストールする必要があります。

 $ sudo apt-get install python-dev 

Python.hへの正しいパスを見つけるには、次のコマンドを実行します—

 $ python -config --cflags 

これにより、次のように出力されます—

ここで、コンパイルコマンドのパスをpython2.7の場合はこれに置き換えるか、Python3.5の場合はバージョンをpython3.5に変更します。 。

最後に、生成されたオブジェクトファイルをリンクして、Windowsの DLLファイルに似た共有オブジェクトを作成する必要があります。次のコマンドを使用すると、共有オブジェクトファイルが生成されます "_ gfg.so" —

 $ gcc -shared gfg.o gfg_wrap.o -o _gfg.so 

これで、Pythonシェルをインポートしてテストする準備が整いました。このシェルファイルのあるディレクトリにいることを確認してください。

> > > gfgをインポート> > > res = fact(5)> > >解像度120> > > res = my_mod(5,2)> > > res 1> > > gfg.cvar.myvar 3.4 

ここでC変数は次のように使用できます。

distutilsを使用したコンパイルとリンク

< / p>

コマンドを入力してファイルをコンパイルするために必要なコンパイルオプションを把握する代わりに、distutilsを使用してこれを自動化できます。以下に示すように作成します&#8212;


#ファイル:setup.py


from distutils.core import setup、Extension

#モジュール名

名前 = "gfg"


#モジュールバージョン

バージョン = "1.0"


#拡張子名とソースファイルを指定します
#コンパイルに必要です

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


setup(name = name、

version = バージョン、

ext_modules = [ext_modules])

次に、モジュールをコンパイルしてインストールするための次のコマンドを記述します&#8212;

 $ python setup.py build_ext --inplace 

これは次のようになります。ターミナルでこのようなもの&#8212;

可能な代替案

明らかに、SWIG&#8212;ラッパーを作成する唯一の方法ではありませんが、要件に基づいて次の代替案を検討できます&#8212;

次は記事では、C ++(OPP)コードをラッパー化する方法を説明します

リンク

  • http://www.swig.org/Doc3.0/Introduction.html

この記事の礼儀 Atul Kumar 。 Python.Engineeringとして貢献したい場合は、 Contributor.python.engineering を使用するか、記事を投稿して記事を書くこともできます。 @ python.engineeringに貢献してください。Python.Engineeringホームページに表示される私の記事を参照して、他のオタクを助けてください。

何か問題を見つけた場合、または議論されたトピックに関する詳細情報を共有したい場合は、コメントを投稿してください上記。

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