2016-09-02 7 views
11

Ich habe jupyter Notebook für die Datenanalyse für ziemlich lange verwendet. Ich würde gerne ein Modul in meinem jupyter Notizbuchverzeichnis entwickeln und dieses neue Modul in Notebooks importieren können. Mein jupyter Notizbuchdateiverzeichnis kann wie folgt dargestellt werden;Wie importiere ich ein Modul im Verzeichnis jupyter Notebook in Notebooks in niedrigeren Verzeichnissen?

Jupyter notebooks\ 

    notebook1.ipynb 

    new_module\ 
     __init__.py 
     newfunction.py 

    currentnotebooks\ 
     notebook2.ipynb 

Bei Verwendung import new_module in notebook1.ipynb es aber funktioniert, wenn ich den gleichen Befehl in notebook2.ipynb versuche ich die folgenden ImportError: No module named 'new_module' erhalten. Die zwei offensichtlichen Lösungen sind A) verschiebe new_module in das Verzeichnis currentnotebooks oder B) verschiebe notebook2.ipynb auf die gleiche Ebene wie new_module. Ich möchte mich nicht mit der Dateistruktur herumschlagen. Ist das möglich?

+0

Wenn Sie 'neues_Modul' in eines der in' sys.path' aufgeführten Verzeichnisse stellen, kann es von überall importiert werden. –

Antwort

15

Sie müssen sicherstellen, dass das übergeordnete Verzeichnis von new_module in Ihrem Python-Pfad ist. Für ein Notebook, das eine Ebene unter new_module ist, wird dieser Code tut den Trick:

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

Wenn Sie weiter unten in der Verzeichnishierarchie sind, dann müssen Sie die Art und Weise nb_dir gesetzt einzustellen, aber das ist alles. Sie sollten nicht diesen Code für ein Notebook in Jupyter notebooks ausführen, da es den Python-Pfad des übergeordneten Elements dieses Verzeichnisses hinzufügen würde, was wahrscheinlich unerwünscht ist.

Der Grund für den Import für notebook1 ist, dass sys.path enthält '' (die leere Zeichenfolge), die aways das aktuelle Verzeichnis des ausgeführten Interpreter (Kernel in diesem Fall) ist. Eine Google-Suche nach explain python path ergibt mehrere gute Erklärungen, wie Python verwendet PYTHONPATH (aka sys.path).

+0

Also muss ich immer den von Ihnen vorgeschlagenen Standardcode eingeben, bevor ich auf andere Module zugreifen kann, auch wenn es nur ein Ordner darüber ist? Gibt es keinen anderen geeigneten Weg, dies zu erreichen, z.B. über relative Importe? (obwohl ich zugeben muss, dass ich immer noch nicht sicher bin, wie relative Importe funktionieren) –

+1

Mehr oder weniger. Die Ausnahme wäre, wenn das übergeordnete Verzeichnis ebenfalls ein Modul wäre (und somit auch eine '_init __. Py' Datei), aber das erscheint mir seltsam und unwahrscheinlich. Wenn Sie das Notizbuchverzeichnis in 'PYTHONPATH' platzieren, müssen Sie es nicht auf diese Weise zu sys.path hinzufügen. – cco

Verwandte Themen