2016-08-24 6 views
16

Ich bin auf einem Jupyter Notebook Server (v4.2.2) mit Python 3.4.2 und ich den globalen Namen __file__, verwenden möchten, weil das Notebook wird von anderen Benutzern und in einem geklont werden Abschnitt ich habe laufen:__file__ hat exisit nicht in Jupyter Notebook

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 von path. So kann ich die zurückgegebenen path sicher später verwenden.

aber ich habe den Fehler

NameError: name '__file__' is not defined

ich online für diesen Fehler gesucht und gefunden, die „Lösung“, die ich besser sys.argv[0] verwenden soll, aber print(sys.argv[0]) kehrt

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

Aber den richtigen Notebook-Standort sollte /home/ubuntu/notebooks/ sein.

Danke für den Hinweis How do I get the current IPython Notebook name von Martijn Pieters (Kommentare) die letzte Antwort (nicht akzeptiert) passt perfekt für meine Bedürfnisse:

print(os.getcwd())

/home/ubuntu/notebooks

+1

'__file__' * bis * Module und Python-Skripte gilt nicht für Notebooks. Die Antworten, die Sie gefunden haben, gelten hier nicht. –

+3

[Wie bekomme ich den aktuellen IPython Notebook-Namen] (http://StackOverflow.com/Q/12544056) sieht relevanter aus? –

Antwort

3

Es ist nicht möglich, den Weg zu bekommen das Notebook. Sie können einen Weg finden, um es zu bekommen, das nur in einer Umgebung funktioniert (zB os.getcwd()), aber es wird nicht notwendigerweise funktionieren, wenn das Notebook auf eine andere Weise geladen wird.

Versuchen Sie stattdessen, das Notebook so zu schreiben, dass es seinen eigenen Pfad nicht kennen muss. Wenn Sie etwas wie pwd machen, dann sollten Sie schnell ausfallen/einen Fehler ausgeben, wenn dies nicht funktioniert, oder einfach nur versuchen, weiterzumachen.

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