LoginSignup
8
7

More than 3 years have passed since last update.

[備忘]自作モジュールimport時のPath取得(Jupyter系も含め)

Last updated at Posted at 2019-07-21

内容

通常の書き方も忘れそうなので

  • 通常の書き方(備忘)
  • 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ディレクトリ内は以下のような大量のモジュールファイルを持っておりそれぞれ様々な関数を内包しています。

スクリーンショット 2019-07-21 14.49.10.png

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を実行すると…
スクリーンショット 2019-07-21 15.14.45.png

pathlibで取得しsysに追加(通した)したpath先のsignal_funcディレクトリの__init__.pyがモジュールとして呼ばれています。

8
7
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
8
7