概要
Cythonでsetup.py
などを書いてパッケージを作ろうとしていたとき、
基本的にフォルダ構成はカオスになる気がしてます。
なぜかというとCythonでC++をラップするとき、どうしてもC++側の実装をラップする箇所は、C++側のヘッダーのコードをCython側にも書き写さなければいけないからです。
これによってファイル数が増加し、フォルダを色々分けないといけなくなります。
このとき、__init__.py
の意味とか、なぜ置くか、みたいなところを全くわかっていないと(私のこと)、詰みます。
どうするのが一番よさそうか
ソースコードが多いので、色々フォルダに分けるところまではいいのですが、
pyx
ファイルからpxd
ファイルをcimport
するとき、
およびフォルダをまたいでpxd
ファイルをcimport
するとき、
ファイルがみつかりません、みたいなエラーが出ることがあります。
そのようなエラーで時間を無駄にしないために、
このようにするのがいいのかなと考えます。
- C++とCythonのコードはフォルダで分ける
- Cythonのコードが入ったフォルダがサブディレクトリを持つとき、それぞれに
__init__.py
を置く。 - Cythonのコードに書く
cimport
は全てプロジェクトの親ディレクトリ(setup.pyがあるところ)から見たパスで書く。
フォルダ構成
例えばこのようなフォルダ構成にします。
setup.py
cpp_code/*
cython_code/
| -- __init__.py
folder_a
| -- __init__.py
| -- test_a.pyx
| -- test_a.pxd
folder_b
| -- __init__.py
| -- test_b.pyx
| -- test_b.pxd
このようなとき、各フォルダに__init__.py
をおき、
例えばtest_b.pxd
がtest_a.pxd
をインポートしたいときは、
from cython_code.folder_a.test_a cimport *
みたいな感じで統一して書くと、おそらくあまりインポートエラーに悩まされずに済むと思います。
備忘録的な感じでまとめました。
おわり。