NokkunBlog

Keep technology simple.

【JupyterNotebook】モジュールをインポートする

こんにちは。のっくんです。

この記事では、Jupyter Notebookで自作のモジュール(.py)をインポートして使う方法を紹介します。

Jupyter Notebookとは

Googleさんで検索すると以下のように出てきます。

Jupyter Notebook(ジュピターノートブック)とは、ノートブック形式で段階的にプログラムを実行し、データ分析作業を行える対話型ブラウザ実行環境です。

機械学習や画像処理の本では必ずと言っていいほどジュピターノートブックを使っています。

実行できるプログラムはPythonですが、ジュピターノートブックの拡張子は「.ipynb」です。

ジュピターノートブック(.ipynb)で自分の作ったモジュール(.py)をimportする時に少しつまづいたので、その手順をまとめておきます。

ちなみに、通常のPythonのimportについては以下の記事にまとめてあります。

https://ymgsapo.com/about-import/

ディレクトリ構成

コードを書く前に、ディレクトリの構成を確認しておきます。

Pycharmのプロジェクトの下にnotebookというディレクトリを作っています。

test.ipynbからhellomod.pyをインポートしたいと思います。

モジュール検索パス

インポートする前に、モジュール検索パスを理解する必要があります。

6.1.2. モジュール検索パス(原文)

spam という名前のモジュールをインポートするとき、インタープリターはまずその名前のビルトインモジュールを探します。見つからなかった場合は、 spam.pyという名前のファイルを sys.path にあるディレクトリのリストから探します。 sys.path は以下の場所に初期化されます:

  • 入力されたスクリプトのあるディレクトリ (あるいはファイルが指定されなかったときはカレントディレクトリ)。
  • PYTHONPATH (ディレクトリ名のリスト。シェル変数の PATH と同じ構文)。
  • インストールごとのデフォルト。

https://docs.python.jp/3/tutorial/modules.html

まぁ色々書いてありますが一言で言うと、

sys.pathにあるディレクトリからしかモジュールをインポートできない

ってことです。

sys.pathって何やねんと思って中身をみて見ると、

test.ipynb

import pprint
import sys

pprint.pprint(sys.path)

実行結果

['',
 '/Users/haru/PycharmProjects/exp/notebook',
 '/Users/haru/anaconda3/envs/experiment/lib/python37.zip',
 '/Users/haru/anaconda3/envs/experiment/lib/python3.7',
 '/Users/haru/anaconda3/envs/experiment/lib/python3.7/lib-dynload',
 '/Users/haru/anaconda3/envs/experiment/lib/python3.7/site-packages',
 '/Users/haru/anaconda3/envs/experiment/lib/python3.7/site-packages/IPython/extensions',
 '/Users/haru/.ipython']

一番上を見ると、’/Users/haru/PycharmProjects/exp/notebook’ってありますね。

つまりnotebookディレクトリ配下のファイルしか見えてないってことになります。

このままだと

hellomod.pyをインポートすることができない

ので、以下のコマンドでexp配下のパスを追加しましょう。

test.ipynb

sys.path.append('/Users/haru/PycharmProjects/exp')

モジュールのインポート

モジュールの中身は以下の通り。

hellomod.py

def method(val):
    print(val)

引数をプリントするだけのものです。importして実行してみましょう。

test.ipynb

import hellomod
hellomod.method("done")

上手くいけば、Jupyter Notebook上で”done”と表示されます。

以上になります。お疲れ様でした。