Pythonのmodule
をCでつくる
モジュールってなんだ?
import するとpythonのオブジェクトとして扱えるファイル
(ざっくり言うとPythonで実行できるコードが書かれたファイル)
「同じようなコード何度も書くのだるくね?」
「じゃあファイルに書けばいいんじゃね?」
「このファイルのことをモジュールって呼ぼうぜ」
こうしてモジュールは誕生した。
モジュールの例 1
同じようなことを何度も書かなくていいので便利
モジュールの例 2
中身がなくても、PythonのVMが解析できれば
立派なモジュール
importってそもそもなにしてんの
import文を使うと、PythonVMがモジュール内のコードを字句解析、構文解析などをしたあとPythonVMが実行可能なバイトコードにしてくれる(= コンパイル)。
「毎回コンパイルするのだるくね?」ということで、*.pyc(py cache)というバイトコードが書かれたファイルをキャッシュ用に作る。
PEP 3147 "PYC Repository Directories"
このモジュールをCで書こうとおもう
$ git clone https://github.com/harukaeru/spam_module.git
ソース
make
コンパイルして
リンカしてる
動作かくにん! よかった
Makefile
spam.soをつくるにはspam.oが必要で、spam.oのために
gcc --sharedナンチャラというコマンドを実行してる。
pkg-configってなんぞ1
# インクルードオプション
-I/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/include/python3.4m
# リンカオプション
-L/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib -lpython3.4m
# ほんとうはこうやらなきゃいけない
gcc -c spam.c -I/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/include/python3.4m -o spam.o
毎回書くのだるくね?
# インクルードオプション
pkg-config --cflags python3
#リンカオプション
pkg-config --libs python3
pkg-configってなんぞ2
これ呼び出してるだけ
/usr/local/Frameworks/Python.framework/Versions/3.4/lib/pkgconfig
MacだとFrameworksとかいうマジキチなところにある
(ふつうはecho $PKG_CONFIG_PATH)
spam.c
#include
Python.hというヘッダファイルをインクルードする。
ないと何もできない。
/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/include/python3.4m/Python.h
MacのHomebrewで入れた人↓
Python.hについて
中でいっぱいヘッダファイルをインクルードしてるので、
とりあえずPython.hだけインクルードすればおk
#include <stdio.h>とか書かなくておk
ヘッダファイルっていうのは
#include <stdio.h>
int main() {
printf("%s", "Hello world\n");
return(0);
}
hoge.c
$ gcc -E -P hoge.c > hoge.p
// -E: Stop after the preprocessing stage; do not run the compiler proper.
// -P: Inhibit generation of linemarkers in the output from the preprocessor.
#include:
コンパイルする前にソースを置き換えてくれるやつ。(プリプロセッサの1つ)
余談: おまじない stdio.h
ヘッダファイルはただのプロトタイプ宣言(pythonでいうとint aしただけミタイナ)だけなので、関数の中身とかはない。
関数の中身とかはgcc, clangにオブジェクトファイル(みたいなやつ)が用意されている。勝手にリンカしてくれる。静的ライブラリとかいう
これをリンカすることによって実行ファイルが完成する
あとはスライド作る時間なかったのでソースみながら
Copy of deck
By Takumi Nakada
Copy of deck
- 980