Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

SWIGを使ってC/C++コードをPython向けにラッピングする方法を徹底解説


既存のC/C++の機能をPythonから利用できるようにする(ラップする)方法は複数あります。この記事では、その中でもSWIGを使ったラッピング手法を詳しく解説します。SWIG以外にも、以下のような選択肢が存在します。

  • 手動でのラッピング
  • Pyrexを使ったCコードのラッピング
  • Ctypes
  • SIP
  • Boost.Python

SWIG(Simple Wrapper Interface Generator)は、C言語のコードをPythonだけでなく、Perl、PHP、Ruby、Tcl、C#、Common Lisp(CLISP、Allegro、CL、UFFI、CFFI)、Java、Modula-3、OCAMLなど、非常に多くの言語向けにラップできる強力なツールです。さらに、Guile、MzScheme、Chickenなど、複数のScheme処理系(インタプリタ型・コンパイル型の両方)にも対応しています。

ただし、この記事ではPython向けの実装に絞って説明を進めます。

SWIGは基本的には一種のマクロ言語であり、Cコードを解析したうえで、指定した言語用のラッパーコードを自動的に生成してくれます。

インストール

ここではWindows用のSWIGインストーラー「swigwin-3.0.12」を使用します。以下の公式サイトからダウンロードできます。

https://www.swig.org/download.html

また、Windows環境でSWIGを動作させるには、「Microsoft Visual Studio 14.0」以降が必要になる場合があります。

SWIGの使い方を説明するために、「既存のC言語の関数を、Tcl、Perl、Python(本記事ではPythonと連携)、Java、C#などの言語から利用できるようにしたい」という状況を想定しましょう。

Cファイル(example.c)

#include "example.h"
int fact(int n) {
   if (n < 0) {      /* 本来はエラーを返すべきだが、ここではシンプルに */
      return 0;
   }
   if (n == 0) {
      return 1;
   } else {
      /* オーバーフローのチェックを入れるのが望ましい */
      return n * fact(n-1);
   }
}

インターフェースファイル

Cファイルをお好みの言語から使えるようにするには、SWIGへの入力となる「インターフェースファイル」を記述する必要があります。example.c用のインターフェースファイルは次の通りです。

example.i

/* File: example.i */
%module example
%{
   #define SWIG_FILE_WITH_INIT
   #include "example.h"
%}
%include "example.h"

ヘッダーファイル

先ほどの例ではヘッダーファイルを読み込んでいます。ヘッダーファイルの内容は以下の通りです。

example.h

int fact(int n);

セットアップファイル

from distutils.core import setup, Extension
example_module = Extension('_example',
   sources=['example_wrap.c', 'example.c'],
)
setup (name = 'example',
   version = '0.1',
   author = "SWIG Docs",
   description = """Simple swig example from docs""",
   ext_modules = [example_module],
   py_modules = ["example"],
)

ラッパーの生成

次に、インターフェースファイル(example.i)を使ってPython用のラッパーを作成します。ラッパーを生成するには、コマンドラインで以下のコマンドを実行するだけです。

>swig -python example.i

コマンド実行後、カレントディレクトリを確認すると、新しいファイルが生成されているはずです。上記と同じファイル名を使用していれば、ラッパーファイルは「example_wrap.c」となります。別のファイル名の場合は、次のような形式で命名されます。

「ファイル名」+「_wrapper」+「対象言語の拡張子」

たとえば、サンプルファイルがtest.cであれば、ラッパーファイルは「test_wrapper.c」という名前になります。

拡張モジュールのビルド

>python setup.py build_ext
running build_ext
building '_example' extension
creating build
creating build\temp.win32-3.6
creating build\temp.win32-3.6\Release
….

これで、C言語の機能をPython向けにラップする作業は完了です。動作確認はそのまま実行しても構いませんし、仮想環境を作成して独立した環境で試すこともできます。

C:\Users\rajesh>mkdir swigExample && cd swigExample
C:\Users\rajesh\swigExample>virtualenv swigenv
Using base prefix 'c:\\python\\python361'
New python executable in C:\Users\rajesh\swigExample\swigenv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

C:\Users\rajesh\swigExample>.\swigenv\Scripts\activate

(swigenv) C:\Users\rajesh\swigExample>python

準備完了です。あとはモジュールから関数をインポートして実行するだけです。

>>> from example import fact
>>> fact(6)
720

  1. C/C++でn番目のカタラン数を求めるプログラム

    カタラン数(Catalan numbers)とは、組み合わせ論におけるさまざまな数え上げ問題に現れる自然数の数列です。特に、再帰的に定義される対象の個数を数える場面で頻繁に登場することで知られています。カタラン数の主な性質ディック語(Dyck word)との関係Cn は、長さ 2n のディック語の総数を表します。ディック語とは、n 個の X と n 個の Y から構成され、文字列のどの先頭部分を見ても Y の数が X の数を超えない文字列のことです。例えば、長さ 6 のディック語は次の通りです。XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY.正しい括弧の対応付けX を開き

  2. Pythonで作るWebサイトブロッカー ― 業務時間中にSNSへのアクセスを自動遮断する方法

    大手IT企業で働いたことがある方なら、FacebookやYouTube、InstagramといったSNS系のWebサイトが社内からアクセスできないよう制限されていることに気づいた経験があるかもしれません。こうした制限は、サードパーティ製アプリに頼らなくても実現できます。自分専用のオリジナルツールを作れば、好きなWebサイトを自由にブロックできるのです。しかもPythonでWebサイトブロッカーを開発するのは、それほど難しいことではありません。この記事では、指定したWebサイトをブロックするPythonスクリプトの作り方を解説します。前提条件Python 3.x がインストールされていることPy