Pythonmodule

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にオブジェクトファイル(みたいなやつ)が用意されている。勝手にリンカしてくれる。静的ライブラリとかいう

これをリンカすることによって実行ファイルが完成する

あとはスライド作る時間なかったのでソースみながら