内容
通常の書き方も忘れそうなので
- 通常の書き方(備忘)
- jupyter特有の書き方(備忘)
- importにおいての
__init__.py
(初心者向け)
通常の書き方
Cだとコンパイルの時にincludeするヘッダファイルとか直接相対Pathとかで指定できた気がしますが、
Pythonでは以下のように書く必要があるようです。
import sys, pathlib
# currentの親ディレクトリのパスを取得
current_dir = pathlib.Path(__file__).resolve().parent
# モジュールのあるパスをsys.pathにappendして通す,今回目的のmodule群のディレクトリは一個上の階層にあるので/../
sys.path.append(str(current_dir) + '/../')
# 今回の目的のモジュール群とその関数を__init__.pyでsignalfuncディレクトリ内モジュール群とその関数全てimportしている
from signal_func import *
from exec_func import *
jupyter系での書き方
通常の書き方だとNameError: name '__file__' is not defined
と怒られるので以下のように書き換えます。
import sys, os
from pathlib import Path
# signalfuncなどのある親ディレクトリのパスを取得,これはJupyter系特有の書き方
current_dir = os.path.join(Path().resolve())
# モジュールのあるパスを追加
sys.path.append(str(current_dir) + '/../')
from signal_func import *
from exec_func import *
importにおいての __init__.py
__init__.py
には様々な役割がありますがモジュールのimportにおいては便利な役割を持っています。
例えば今回のsignal_funcディレクトリ内は以下のような大量のモジュールファイルを持っておりそれぞれ様々な関数を内包しています。
importにおいて__init__.py
はそのディレクトリがimportされた時に実行されるファイルになります。
つまりfrom signal_func import *
を行った時点でsignal_funcディレクトリ内の__init__.py
が実行され各分析モジュール(bband.pyとか)に内包された全ての関数(bband_buy_func(),bband_sell_func()とか)を*でimportしそのまま呼び出せる様にしているということになります。
実際にjupyter上でimportしたsignal_funcを実行すると…
pathlibで取得しsysに追加(通した)したpath先のsignal_funcディレクトリの__init__.py
がモジュールとして呼ばれています。