web-dev-qa-db-ja.com

jupyterノートブックディレクトリのモジュールを下位ディレクトリのノートブックにインポートするにはどうすればよいですか?

私はかなり長い間、データ分析にjupyterノートブックを使用しました。 jupyterノートブックディレクトリでモジュールを開発し、その新しいモジュールをノートブックにインポートできるようにします。私のjupyterノートブックファイルディレクトリは、次のように表すことができます。

Jupyter notebooks\

    notebook1.ipynb

    new_module\
        __init__.py
        newfunction.py

    currentnotebooks\
        notebook2.ipynb

Notebook1.ipynbでimport new_moduleを使用すると、notebook2.ipynbで同じコマンドを実行すると機能しますが、次のImportError: No module named 'new_module'が表示されます。 2つの明らかな解決策は、A)new_moduleをcurrentnotebooksディレクトリに移動するか、B)notebook2.ipynbをnew_moduleと同じレベルに移動することです。ファイル構造をいじりたくありません。これは可能ですか?

22
James Draper

new_moduleの親ディレクトリがpythonパス上にあることを確認する必要があります。 new_moduleの1レベル下のノートブックの場合、このコードはトリックを実行します。

import os
import sys
nb_dir = os.path.split(os.getcwd())[0]
if nb_dir not in sys.path:
    sys.path.append(nb_dir)

ディレクトリ階層のさらに下にいる場合は、nb_dirの設定方法を調整する必要がありますが、それだけです。このディレクトリの親をpythonに追加するので、Jupyter notebooksのノートブックに対してこのコードをnot実行する必要があります。おそらく望ましくないパス。

インポートがnotebook1で機能する理由は、sys.pathに''(空の文字列)が含まれており、実行中のインタープリター(この場合はカーネル)の現在のディレクトリから離れているためです。 Googleでexplain python pathを検索すると、pythonがPYTHONPATH(別名sys.path)をどのように使用するかについてのいくつかの良い説明が見つかります。

37
cco