2016-09-02 3 views
11

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

Jupyter notebooks\ 

    notebook1.ipynb 

    new_module\ 
     __init__.py 
     newfunction.py 

    currentnotebooks\ 
     notebook2.ipynb 

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

+0

Если вы поместите 'new_module' в один из каталогов, перечисленных в' sys.path', он будет импортироваться из любого места. –

ответ

15

Вам необходимо убедиться, что родительский каталог 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 PYTHONPATH (aka sys.path).

+0

Так что я всегда должен сделать ваш предложенный шаблонный код, прежде чем я смогу получить доступ к другим модулям, даже если они только одна папка выше? Нет ли другого подходящего способа достижения этого, например. через относительный импорт? (хотя я должен признать, что я до сих пор не уверен, как работает относительный импорт) –

+1

Более или менее. Исключение было бы, если родительский каталог также был модулем (и имел файл '__init __. Py'), но это кажется мне странным и маловероятным. Помещение каталога ноутбука в 'PYTHONPATH' позволит избежать необходимости добавлять его в sys.path таким образом. – cco