pythonでプログラムを書く上で最初に激突した壁が「他のファイルに書いたクラスとか関数とかをどうやって呼べばいいの?」ってことでした。

自作のライブラリがimportできない!

「ライブラリ」っていうほど立派なもんでもないんですが、自作の共通関数を別ファイルに書いておいてあちこちから使おうと思ったのにどうやって読みこめばいいのかがわからずに小一時間頭を抱えていました。

ImportError: No module named mymodule

こんなメッセージがずーっと出てきてちっとも先に進めませんでした。

__init__.pyという謎のファイル

pythonのソースを見ていると至る所にこの「__init__.py」という謎のファイルが登場します。これがなんなのかさっぱりわかりませんでした。

pythonはこの「__init__.py」ファイルがあるフォルダをライブラリのフォルダとして認識するのだそうです。逆に言うと、このファイルがないフォルダの下にあるファイルはインポートすることができません。

myapp/
+-main.py
+-mylib/
    +-__init__.py
    +-mymodule.py

こんな感じで、モジュールとして使いたいファイルと同じフォルダに「__init__.py」という名前のファイルを保存しておきます。中身は空っぽで構いません。これでmain.pyの中からmymodule.pyをインポートして使うことができます。

以下のように、「mymodule.py」というファイルの中で「myfunction」という名前の関数が定義されているとします。

# mymodule.py
def myfunction():
  print('Hello Module!!!')

main.pyからは以下のようにして関数を呼び出すことができます。

# main.py
from mylib.mymodule import myfunction
myfunction()

from のところに読み込むファイルのパスを「.」(ドット)で区切って書きます。ファイル名の「.py」は省略できるみたいです。

その後にimportで読み込む関数やクラス名を指定します。

上の例だと「mylib/mymodule.py」ファイルに定義されている「myfunction」をインポートするよ。っていうことになります。

知ってしまった今では簡単なことなのだけど

pythonのインポート文はクォーテーションのいらない自然な書きやすい形式ということもあって、使い方を知ってしまった今では空気を吸うように使うことができます。

しかし、使い方を知る前の暗闇に包まれてさまよっているときの絶望感はひどいものがあります。

「__init__.py」のことを知らずに、インポート文の書き方がおかしいのだと思い込んで

import mylib.mymodule.myfunction

とか

from mylib import mymodule.myfunction

とかやって、いくらやっても動かずに涙目になっていました。