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 path
zurück. So kann ich den 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 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
Wenn Sie den Pfad des Verzeichnisses erhalten möchten, in dem Ihr Skript ausgeführt wird, empfehle ich Folgendes:
os.path.abspath('')
Vorteile
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.
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
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 wurde in ~/dir1/dir2
gestartet:
__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')