LoginSignup
5
4

More than 3 years have passed since last update.

Cythonでパッケージを作るときにフォルダ間インポートで悩んだときはこれをみて。

Posted at

概要

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.pxdtest_a.pxdをインポートしたいときは、

test_b.pxd

from cython_code.folder_a.test_a cimport *

みたいな感じで統一して書くと、おそらくあまりインポートエラーに悩まされずに済むと思います。

備忘録的な感じでまとめました。

おわり。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4