Как импортировать модуль в каталог ноутбуков jupyter в ноутбуки в нижних каталогах?

Я использовал jupyter notebook для анализа данных довольно давно. Я хотел бы разработать модуль в моем каталоге ноутбуков jupyter и иметь возможность импортировать этот новый модуль в ноутбуки. Мой каталог файлов ноутбуков jupyter может быть представлен следующим образом;

Jupyter notebooks\

    notebook1.ipynb

    new_module\
        __init__.py
        newfunction.py

    currentnotebooks\
        notebook2.ipynb

При использовании import new_module в notebook1.ipynb он работает, однако, когда я пытаюсь import new_module ту же команду в notebook2.ipynb, я получаю следующий ImportError: No module named 'new_module'. Два очевидных решения: A) переместить new_module в каталог currentnotebooks или B) переместить notebook2.ipynb на тот же уровень, что и new_module. Я вообще не хочу вмешиваться в файловую структуру. Это возможно?

Ответ 1

Вы должны убедиться, что родительский каталог new_module находится на вашем пути к Python. Для ноутбука, который находится на один уровень ниже new_module, этот код поможет:

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, но это все. Вы не должны запускать этот код для записной книжки в Jupyter notebooks, так как это добавит родителя этого каталога в путь python, что, вероятно, нежелательно.

Причина, по которой импорт работает для notebook1 заключается в том, что sys.path содержит '' (пустую строку), которая находится в стороне от текущего каталога работающего интерпретатора (в данном случае, ядра). Поиск в Google для explain python path python sys.path несколько хороших объяснений того, как python использует PYTHONPATH (он же sys.path).