Ich bin auf einem Jupyter Notebook- Server (v4.2.2) mit Python 3.4.2 und möchte den globalen Namen verwenden __file__
, da das Notebook von anderen Benutzern geklont wird und ich in einem Abschnitt Folgendes ausführen 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
param ein relativer oder absoluter Pfad ist und gibt die absolute Version path
. So kann ich die zurückgegebenen path
spä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 verwenden sollte sys.argv[0]
, aber print(sys.argv[0])
zurückgibt
/usr/local/lib/python3.4/dist-packages/ipykernel/__main__.py
Der richtige Ort für das Notebook sollte jedoch sein /home/ubuntu/notebooks/
.
Vielen Dank für die Referenz. Wie erhalte ich den aktuellen IPython Notebook-Namen von Martijn Pieters (Kommentare)? Die letzte Antwort (nicht akzeptiert) passt perfekt zu meinen Anforderungen:
print(os.getcwd())
/ home / ubuntu / notebooks
quelle
__file__
gilt für Module und Python-Skripte , nicht für Notebooks. Die Antworten, die Sie gefunden haben, gelten hier nicht.Antworten:
Wenn Sie den Pfad des Verzeichnisses abrufen möchten, in dem Ihr Skript ausgeführt wird, würde ich die Verwendung von empfehlen.
os.path.abspath('')
Vorteile
Bitte beachten Sie, dass ein Szenario von
__file__
Vorteil ist, wenn Sie Python aus Verzeichnis A aufrufen, aber das Skript in Verzeichnis B ausführen. In diesem Fall geben die meisten anderen Methoden A und nicht B zurück. Für Jupyter notbook erhalten Sie jedoch immer einen Ordner für.ipyn
Datei anstelle des Verzeichnisses, von dem aus Sie gestartet habenjupyter notebook
.quelle
__file__
Möglicherweise ist es für Sie nicht verfügbar, aber Sie können den aktuellen Ordner abrufen, in dem sich Ihr Notebook tatsächlich auf andere Weise befindet.Es gibt Spuren in globalen Variablen. Wenn Sie aufrufen, werden
globals()
Sie feststellen_dh
, dass der Schlüssel ein Element enthält , das Ihnen möglicherweise hilft. So habe ich es geschafft, diedata.csv
Datei zu laden, 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')
quelle
Es ist nicht möglich, den Pfad zum Notizbuch zu finden. Möglicherweise finden Sie einen Weg, um es zu erhalten, der nur in einer Umgebung funktioniert (z. B.
os.getcwd()
), aber es funktioniert nicht unbedingt, wenn das Notebook auf eine andere Weise geladen wird.Versuchen Sie stattdessen, das Notizbuch so zu schreiben, dass es seinen eigenen Pfad nicht kennen muss. Wenn Sie beispielsweise das pwd abrufen, sollten Sie schnell fehlschlagen / einen Fehler drucken, wenn dies nicht funktioniert, anstatt nur still zu versuchen, fortzufahren.
Siehe auch: https://github.com/ipython/ipython/issues/10123
quelle
In modernem Python (v3.4 +) können wir 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/') # or this way, thanks @NunoAndré: cwd = Path.cwd() # cwd == PosixPath('/path/to/this/jupyter/ipynb/file's/directory/')
Aktualisieren
@ShitalShah Ich kann den von Ihnen gemeldeten Fehler nicht reproduzieren. Jupyter Notebook scheint gut zu funktionieren, unabhängig vom aktuellen Arbeitsverzeichnis, in dem die Anwendung gestartet wurde.
Beispiel: Datei
~/dir1/dir2/untitled.ipynb
und Jupyter-Notizbuch gestartet in~/dir1
:Jupyter Notebook begann in
~/dir1/dir2
:quelle
Path
hat eine Klassenmethode nur dafür:Path.cwd()