C言語書きPython extension実践
4493 ワード
実践としか言いようがない.簡単すぎるからだ.
この実践の発生は中国Linuxフォーラムのringsの友达の投稿によるものです.Python拡張モジュールをCで記述する方法の詳細な手順を提供します.[エッセンス]windowsでpythonを拡張 .しかし、その方法でVC++環境を使うには、私も当時はありませんでした.Windows 98+cygwinの環境がありますが、上記の方法は私の環境では成功しません.Googleに助けを求めて記事を見つけました
Python + Windows + distutils + SWIG + gcc MinGW or “Creating Python extensions in C/C++ with SWIG and compiling them with MinGW gcc under Windows” or “Installing Python extension with distutils and without Microsoft Visual C++”.
この記事では,VC++環境を用いずにMinGW環境のみでPythonの拡張を生成する方法について詳しく述べた.そこで私は文の中の方法に従って正しく実現した.では、私の環境での実現について簡単に述べます.
1.MinGW gccのインストール
私はとっくにcygwinをインストールしているので、上にはgccが付いています.このステップは省略します.
2.libpython 23を生成する.a
私のpythonバージョンはpython 2.3.3です.なぜ生成するのか.aファイルは、gccで使用するライブラリが.a形式です.pythonのインストールが完了するとdllsディレクトリの下にpythonXXがあります.libのファイル、それはVC++フォーマットのライブラリファイルで、gccは使えません.つまり、Python自体は持っていません.aライブラリの、私たちは自分で生成する必要があります.生成方法は、次のとおりです.
pexportをダウンロードします.ここには0.43バージョンが更新されています。解凍後、コマンドで見つけられる場所に実行コードがあればいいです.cygwin/binディレクトリの下に置きました.
Python 23を得る.dll.仕事のために、dllをこのディレクトリにコピーする作業ディレクトリを作成しました.
コマンドラインウィンドウに入ります.cygwin環境に入るかどうかはどうでもいいので、cygwin/binのディレクトリをPATHに追加しました.
実行:pexports python 23.dll >python23.def
実行:dlltool–dllname python 23.dll –def python23.def –output-lib libpython23.a
libpython 23をa pythonインストールディレクトリのlibsサブディレクトリにコピーします.実は拷問しても拷問しなくても構わない.このようにするのは後で便利にするためだけだ.
そうですか.aライブラリが生成されました.
3.SWIGのインストール
SWIGはcygwinに既に存在していますが、ネットからダウンロードできない場合は、必ずインストールしてください.
4.拡張機能の作成
example.cファイル
5.distutilsを使用して拡張子をコンパイルする
pythonにはコンパイルツールdisutilsが付属しています.△原文で述べたdisutilsには、手作業で修正する問題があります.私が使っている2.3.3にはもう存在しません.setupを作成します.pyファイル.
6.新しい拡張機能のテスト
生成したファイルをpython対応のディレクトリにコピーすることなく、現在のディレクトリで直接テストできます.コマンドラインでpythonを起動し、次のテストを行います.
>>> import example>>> example.fact(5)120>>> example.my_mod(7,3)1>>> example.get_time()‘Mon Apr 12 15:46:27 2004’>>>
成功しました.
ringsが紹介したのは、Pythonを使うために拡張プログラムを完全に自分で書いたことです.hで定義された関数、構造.SWIGを使用すると、この面の敷居を減らすことができ、比較的簡単です.ましてや、VC++でDLLにコンパイルするのも面倒です.disutilsを使用すると、これらの問題はまったく考慮されません.
pythonドキュメントの詳細については、次のトピックを参照してください.
Extending and Embedding
Python/C API
Distributing
Python
Moules
そしてSWIG側のドキュメントです.
この実践の発生は中国Linuxフォーラムのringsの友达の投稿によるものです.Python拡張モジュールをCで記述する方法の詳細な手順を提供します.[エッセンス]windowsでpythonを拡張 .しかし、その方法でVC++環境を使うには、私も当時はありませんでした.Windows 98+cygwinの環境がありますが、上記の方法は私の環境では成功しません.Googleに助けを求めて記事を見つけました
Python + Windows + distutils + SWIG + gcc MinGW or “Creating Python extensions in C/C++ with SWIG and compiling them with MinGW gcc under Windows” or “Installing Python extension with distutils and without Microsoft Visual C++”.
この記事では,VC++環境を用いずにMinGW環境のみでPythonの拡張を生成する方法について詳しく述べた.そこで私は文の中の方法に従って正しく実現した.では、私の環境での実現について簡単に述べます.
1.MinGW gccのインストール
私はとっくにcygwinをインストールしているので、上にはgccが付いています.このステップは省略します.
2.libpython 23を生成する.a
私のpythonバージョンはpython 2.3.3です.なぜ生成するのか.aファイルは、gccで使用するライブラリが.a形式です.pythonのインストールが完了するとdllsディレクトリの下にpythonXXがあります.libのファイル、それはVC++フォーマットのライブラリファイルで、gccは使えません.つまり、Python自体は持っていません.aライブラリの、私たちは自分で生成する必要があります.生成方法は、次のとおりです.
pexportをダウンロードします.ここには0.43バージョンが更新されています。解凍後、コマンドで見つけられる場所に実行コードがあればいいです.cygwin/binディレクトリの下に置きました.
Python 23を得る.dll.仕事のために、dllをこのディレクトリにコピーする作業ディレクトリを作成しました.
コマンドラインウィンドウに入ります.cygwin環境に入るかどうかはどうでもいいので、cygwin/binのディレクトリをPATHに追加しました.
実行:pexports python 23.dll >python23.def
実行:dlltool–dllname python 23.dll –def python23.def –output-lib libpython23.a
libpython 23をa pythonインストールディレクトリのlibsサブディレクトリにコピーします.実は拷問しても拷問しなくても構わない.このようにするのは後で便利にするためだけだ.
そうですか.aライブラリが生成されました.
3.SWIGのインストール
SWIGはcygwinに既に存在していますが、ネットからダウンロードできない場合は、必ずインストールしてください.
4.拡張機能の作成
example.cファイル
/* File : example.c */
#include <time.h>double My_variable = 3.0;
int fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); }
int my_mod(int x, int y) { return (x%y); }
char *get_time() { time_t ltime; time(<ime); return ctime(<ime); }
example.i
/* example.i */%module example%{/* Put header files here (optional) */%}
extern double My_variable;extern int fact(int n);extern int my_mod(int x, int y);extern char *get_time();
5.distutilsを使用して拡張子をコンパイルする
pythonにはコンパイルツールdisutilsが付属しています.△原文で述べたdisutilsには、手作業で修正する問題があります.私が使っている2.3.3にはもう存在しません.setupを作成します.pyファイル.
# setup.pyimport distutilsfrom distutils.core import setup, Extension setup(name = "Simple example from theSWIG website",version = "2.2",ext_modules = [Extension("_example", ["example.i","example.c"])])
:
Python setup.py build -cmingw32
, 。 , example.py _example.pyd 。
6.新しい拡張機能のテスト
生成したファイルをpython対応のディレクトリにコピーすることなく、現在のディレクトリで直接テストできます.コマンドラインでpythonを起動し、次のテストを行います.
>>> import example>>> example.fact(5)120>>> example.my_mod(7,3)1>>> example.get_time()‘Mon Apr 12 15:46:27 2004’>>>
成功しました.
ringsが紹介したのは、Pythonを使うために拡張プログラムを完全に自分で書いたことです.hで定義された関数、構造.SWIGを使用すると、この面の敷居を減らすことができ、比較的簡単です.ましてや、VC++でDLLにコンパイルするのも面倒です.disutilsを使用すると、これらの問題はまったく考慮されません.
pythonドキュメントの詳細については、次のトピックを参照してください.
Extending and Embedding
Python/C API
Distributing
Python
Moules
そしてSWIG側のドキュメントです.