🐍

__init__.py の書き方を永遠に覚えられない私へ

2023/05/18に公開

自作スクリプトをパッケージ化するときの書き方

業務で自作のPythonスクリプトをパッケージ化する必要に迫られたのですが、意外とハマったので備忘録を残しておきます。

Pythonバージョンは3.9.xです。

例示

構成

+ hoge/
    +- __init__.py
    +- foo.py
$ cat hoge/__init__.py

from .foo import bar

$ cat hoge/foo.py

def bar(msg :str="Hello World!"):
    print(msg)
    return None

if __name__=="__main__":
    bar()
    exit()

基本的なポイント

  • パッケージ宣言のようなものは不要
  • ディレクトリを作り、__init__.py と一緒に クラスや関数を定義した.pyを放り込む
    • ディレクトリ名がそのままパッケージ名になる
    • __init__.pyで、使いたい関数やクラスをimportしておく
      • __init__.pyは空でもいいし最悪なくてもよいが、あったほうがよい
      • importでは相対パスが使える
      • ファイルfoo.pyを読み込む場合、上記のように「カレントディレクトリにあるfoo」(.foo)を明示的に指定する(でないと読み込めなくて落ちた)
      • barはデフォルトで読み込みたい(読み込ませたい)関数やクラスを指定する
    • __init__.pyで読み込んでいない関数やクラスは、パッケージをただimportしても使えない。(sklearnを思い出そう)

Discussion