web-dev-qa-db-de.com

__Datei__ ist in Jupyter Notebook nicht vorhanden

Ich bin auf einem Jupyter Notebook Server (v4.2.2) mit Python 3.4.2 und möchte den globalen Namen __file__ verwenden, da das Notebook von anderen Benutzern geklont wird und in einem Abschnitt ausgeführt werden muss:

def __init__(self, trainingSamplesFolder='samples', maskFolder='masks'):
    self.trainingSamplesFolder = self.__getAbsPath(trainingSamplesFolder)
    self.maskFolder = self.__getAbsPath(maskFolder)

def __getAbsPath(self, path):
    if os.path.isabs(path):
        return path
    else:
        return os.path.join(os.path.dirname(__file__), path)

Die __getAbsPath(self, path) prüft, ob ein path-Parameter ein relativer oder absoluter Pfad ist, und gibt die absolute Version von pathzurück. So kann ich den zurückgegebenen pathspäter sicher verwenden.

Aber ich bekomme den Fehler

NameError: name '__file__' ist nicht definiert

Ich habe online nach diesem Fehler gesucht und die "Lösung" gefunden, die ich besser für sys.argv[0] verwenden sollte, aber print(sys.argv[0]) gibt zurück

/usr/local/lib/python3.4/dist-packages/ipykernel/__main__.py

Der richtige Speicherort für das Notebook sollte jedoch /home/ubuntu/notebooks/ sein.

Vielen Dank für den HinweisWie bekomme ich den aktuellen IPython Notebook-Namenvon Martijn Pieters (Kommentare) Die letzte Antwort (nicht akzeptiert) passt perfekt zu meinen Bedürfnissen:

print(os.getcwd())

/ home/ubuntu/notebooks

31
Fabian

Wenn Sie den Pfad des Verzeichnisses erhalten möchten, in dem Ihr Skript ausgeführt wird, empfehle ich Folgendes:

os.path.abspath('')

Vorteile

  • Es funktioniert von Jupyter Notebook
  • Es funktioniert von REPL
  • Es ist keine Python 3.4-Pathlib erforderlich

Beachten Sie bitte, dass __file__ von Vorteil ist, wenn Sie Python aus Verzeichnis A aufrufen, jedoch das Skript in Verzeichnis B ausführen. In diesem Fall geben sowohl die meisten anderen Methoden A als B zurück Ordner für .ipyn-Datei anstelle des Verzeichnisses, von dem aus Sie jupyter notebook gestartet haben.

5
Shital Shah

Es ist nicht möglich, den Pfad zum Notebook zu ermitteln. Möglicherweise finden Sie einen Weg, um es zu erhalten, das nur in einer Umgebung funktioniert (z. B. os.getcwd()). Dies funktioniert jedoch nicht unbedingt, wenn das Notebook auf andere Weise geladen wird.

Versuchen Sie stattdessen, das Notebook so zu schreiben, dass es seinen eigenen Pfad nicht kennen muss. Wenn Sie so etwas wie das pwd machen, dann schlagen Sie sicher, dass der Fehler schnell ausfällt/eine Fehlermeldung ausgegeben wird, wenn dies nicht funktioniert.

Siehe auch: https://github.com/ipython/ipython/issues/10123

12
michael

In der modernen Version von Python (v3.4 +) können Sie pathlib verwenden, um das Verzeichnis des Notebooks abzurufen:

from pathlib import Path

cwd = Path().resolve()
# cwd == PosixPath('/path/to/this/jupyter/ipynb/file's/directory/')



Update

@ShitalShah Ich kann den von Ihnen gemeldeten Fehler nicht reproduzieren. Jupyter Notebooks scheint gut zu funktionieren, unabhängig vom aktuellen Arbeitsverzeichnis, in dem die Anwendung gestartet wurde.

Beispiel: Datei ~/dir1/dir2/untitled.ipynb und Jupyter-Notizbuch wurden in ~/dir1 gestartet:

 Jupyter notebook started in ~/dir1

Jupyter Notebook wurde in ~/dir1/dir2 gestartet:

 Jupyter notebook started in ~/dir1/dir2

9
mab

__file__ ist möglicherweise nicht für Sie verfügbar, Sie können jedoch den aktuellen Ordner, in dem sich Ihr Notizbuch befindet, auf andere Weise abrufen.

Es gibt Spuren in globalen Variablen. Wenn Sie globals() aufrufen, sehen Sie, dass ein Element mit dem Schlüssel _dh vorhanden ist. So habe ich die data.csv-Datei geladen, die sich im selben Ordner wie mein Notizbuch befindet:

import os

current_folder = globals()['_dh'][0]

# Calculating path to the input data
data_location = os.path.join(current_folder,'data.csv')
1
shytikov