##はじめに
今回やりたいことは、
ctypedef numpy.float64_t DOUBLE_t
と定義したい。
これをやるためには、
cimport numpy
をやる必要がある。
この二つのctypedef
とcimport
をやりたいということです。
※英語が読めない自分が英語のdocument見ながらやったので間違ってる場合があります。途中のエラーとか見たくない人は最後だけみてください。
環境はこんな感じです。
OS X, Yosemite
Cython 0.23.4
Python 3.4.3
#cythonコンパイル時に次のようなエラーが発生。
Cython 0.23.2 documentation: Building Cython codeのページを参考にし、下記の二つのスクリプトを作成してみる。
import numpy
cimport numpy
ctypedef numpy.float64_t DOUBLE_t
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'test',
ext_modules = cythonize('test.pyx')
)
これを使って、python setup.py build_ext --inplace
を行うと、下記のようなエラーが発生。
sample.c:250:10: fatal error: 'numpy/arrayobject.h' file not found
#include "numpy/arrayobject.h"
^
1 error generated.
error: command 'clang' failed with exit status 1
ファイルが見当たらないってエラーが出ました。
パスが違うようですね、ってことでもう少し先ほどのサイトを見てみると、
こんなものが、Cython 0.23.2 documentation: Compilation
Often, Python packages that offer a C-level API provide a way to find the necessary include files, e.g. for NumPy:
include_path = [numpy.get_include()]
よくあることっぽかったですね。
とりあえず、これをsetup.py
に入れてみます。
from distutils.core import setup
from Cython.Build import cythonize
import numpy
setup(
name = 'test',
ext_modules = cythonize('test.pyx')
include_path = [numpy.get_include()]
)
これ使ってみるとなんかまたエラー出る
Unknown distribution option: 'include_path'
なんぞこれ、こんなオプションないって言われた。
stackoverflowとか色々見てみると、みんなinclude_path
なんか使ってなくて、include_dirs
を使ってるっぽい。
とりあえずs/include_path/include_dirs
してみる。
from distutils.core import setup
from Cython.Build import cythonize
import numpy
setup(
name = 'test',
ext_modules = cythonize('test.pyx')
include_dirs = [numpy.get_include()]
)
実行してみると、通った(o・ω・o)
なんかわからんけどできたっぽい。
##まとめ
include_dirs = [numpy.get_include()]
使うといいっぽい。
新しいものだと日本語で書かれているものが少ないので、英語がわからないと辛いものがある。
今回一応はコンパイル通ったが、unused function
のwarningがいっぱい出てたのでなんか直さないといけないかも?(unused functionだから放置しても良いかも)