Numpy、は大量の
一言で言えば、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変数は次のように使用できます。
< / p>
コマンドを入力してファイルをコンパイルするために必要なコンパイルオプションを把握する代わりに、distutilsを使用してこれを自動化できます。以下に示すように作成します&#8212;
次に、モジュールをコンパイルしてインストールするための次のコマンドを記述します&#8212; $ python setup.py build_ext --inplace これは次のようになります。ターミナルでこのようなもの&#8212; ![]() 可能な代替案 明らかに、SWIG&#8212;ラッパーを作成する唯一の方法ではありませんが、要件に基づいて次の代替案を検討できます&#8212; 次は記事では、C ++(OPP)コードをラッパー化する方法を説明します リンク
この記事の礼儀 何か問題を見つけた場合、または議論されたトピックに関する詳細情報を共有したい場合は、コメントを投稿してください上記。 ShopLatest questions Wiki |