webentwicklung-frage-antwort-db.com.de

Wie erhalte ich den aktuellen IPython Notebook-Namen?

Ich versuche, den aktuellen NoteBook-Namen zu ermitteln, wenn ich das IPython-Notizbuch verwende. Ich weiß, dass ich es oben auf dem Notizbuch sehen kann. Was bin ich nach so etwas

currentNotebook = IPython.foo.bar.notebookname()

Ich muss den Namen in einer Variablen erhalten.

58
Tooblippe

Wie bereits erwähnt, solltest du das wahrscheinlich nicht wirklich können, aber ich habe einen Weg gefunden. Es ist ein flammender Hack, also verlassen Sie sich überhaupt nicht darauf:

import json
import os
import urllib2
import IPython
from IPython.lib import kernel
connection_file_path = kernel.get_connection_file()
connection_file = os.path.basename(connection_file_path)
kernel_id = connection_file.split('-', 1)[1].split('.')[0]

# Updated answer with semi-solutions for both IPython 2.x and IPython < 2.x
if IPython.version_info[0] < 2:
    ## Not sure if it's even possible to get the port for the
    ## notebook app; so just using the default...
    notebooks = json.load(urllib2.urlopen('http://127.0.0.1:8888/notebooks'))
    for nb in notebooks:
        if nb['kernel_id'] == kernel_id:
            print nb['name']
            break
else:
    sessions = json.load(urllib2.urlopen('http://127.0.0.1:8888/api/sessions'))
    for sess in sessions:
        if sess['kernel']['id'] == kernel_id:
            print sess['notebook']['name']
            break

Ich habe meine Antwort aktualisiert, um eine Lösung aufzunehmen, die in IPython 2.0 zumindest mit einem einfachen Test "funktioniert". Es ist wahrscheinlich nicht garantiert, dass die richtige Antwort angezeigt wird, wenn mehrere Notebooks mit demselben Kernel usw. verbunden sind.

23
Iguananaut

Ich habe die folgenden, die mit IPython 2.0 funktioniert. Ich habe festgestellt, dass der Name des Notizbuchs als Wert des Attributs 'data-notebook-name' Im Tag <body> Der Seite gespeichert ist. Die Idee ist also, zuerst Javascript zu bitten, das Attribut abzurufen - Javascripts können dank der Magie %%javascript Von einer Codezelle aus aufgerufen werden. Dann ist es möglich, über einen Aufruf des Python Kernels mit einem Befehl, der eine Python Variable setzt, auf die Javascript-Variable zuzugreifen Aus dem Kernel bekannt, kann auf ihn auch in anderen Zellen zugegriffen werden.

%%javascript
var kernel = IPython.notebook.kernel;
var body = document.body,  
    attribs = body.attributes;
var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'";
kernel.execute(command);

Aus einer Python Code-Zelle

print(theNotebook)

Out []: HowToGetTheNameOfTheNoteBook.ipynb

Ein Fehler bei dieser Lösung besteht darin, dass, wenn der Titel (Name) eines Notizbuchs geändert wird, dieser Name nicht sofort aktualisiert zu werden scheint (wahrscheinlich gibt es eine Art Cache) und dass das Notizbuch neu geladen werden muss, um auf das Notizbuch zugreifen zu können neuer Name.

[Edit] Nachdenken ist eine effizientere Lösung, das Eingabefeld für den Namen des Notebooks anstelle des Tags <body> Zu suchen. Ein Blick in die Quelle zeigt, dass dieses Feld die ID "notebook_name" hat. Es ist dann möglich, diesen Wert mit einer document.getElementById() abzufangen und dann den gleichen Ansatz wie oben zu befolgen. Der Code wird immer noch mit der Javascript-Magie

%%javascript
var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook = " + "'"+thename+"'";
kernel.execute(command);

Dann aus einer Ipython-Zelle,

In [11]: print(theNotebook)
Out [11]: HowToGetTheNameOfTheNoteBookSolBis

Im Gegensatz zur ersten Lösung werden Änderungen am Namen des Notizbuchs sofort aktualisiert und das Notizbuch muss nicht aktualisiert werden.

34
jfb

zu vorherigen Antworten hinzufügen

um den Namen des Notizbuchs zu erhalten, führen Sie Folgendes in einer Zelle aus:

%%javascript
IPython.notebook.kernel.execute('nb_name = "' + IPython.notebook.notebook_name + '"')

dadurch erhalten Sie den Dateinamen in nb_name

um den vollständigen Pfad abzurufen, können Sie in einer separaten Zelle Folgendes verwenden:

import os
nb_full_path = os.path.join(os.getcwd(), nb_name)
28
Mahmoud Elagdar

Auf Jupyter 3.0 funktioniert folgendes. Hier zeige ich den gesamten Pfad auf dem Jupyter-Server, nicht nur den Namen des Notebooks:

So speichern Sie das NOTEBOOK_FULL_PATH auf dem aktuellen Notebook-Frontend:

%%javascript
var nb = IPython.notebook;
var kernel = IPython.notebook.kernel;
var command = "NOTEBOOK_FULL_PATH = '" + nb.base_url + nb.notebook_path + "'";
kernel.execute(command);

So zeigen Sie es an:

print("NOTEBOOK_FULL_PATH:\n", NOTEBOOK_FULL_PATH)

Das Ausführen der ersten Javascript -Zelle erzeugt keine Ausgabe. Wenn Sie die zweite Python -Zelle ausführen, erhalten Sie Folgendes:

NOTEBOOK_FULL_PATH:
 /user/zeph/GetNotebookName.ipynb
24

Ich kann anscheinend keinen Kommentar abgeben, daher muss ich dies als Antwort posten.

Die von @iguananaut akzeptierte Lösung und das Update von @mbdevpl funktionieren anscheinend nicht mit den neuesten Versionen des Notebooks. Ich habe es wie unten gezeigt behoben. Ich habe es auf Python v3.6.1 + Notebook v5.0.0 und auf Python v3.6.5 und Notebook v5.5.0 überprüft.

from notebook import notebookapp
import urllib
import json
import os
import ipykernel

def notebook_path():
    """Returns the absolute path of the Notebook or None if it cannot be determined
    NOTE: works only when the security is token-based or there is also no password
    """
    connection_file = os.path.basename(ipykernel.get_connection_file())
    kernel_id = connection_file.split('-', 1)[1].split('.')[0]

    for srv in notebookapp.list_running_servers():
        try:
            if srv['token']=='' and not srv['password']:  # No token and no password, ahem...
                req = urllib.request.urlopen(srv['url']+'api/sessions')
            else:
                req = urllib.request.urlopen(srv['url']+'api/sessions?token='+srv['token'])
            sessions = json.load(req)
            for sess in sessions:
                if sess['kernel']['id'] == kernel_id:
                    return os.path.join(srv['notebook_dir'],sess['notebook']['path'])
        except:
            pass  # There may be stale entries in the runtime directory 
    return None

Wie im Dokument angegeben, funktioniert dies nur, wenn entweder keine Authentifizierung vorliegt oder die Authentifizierung auf einem Token basiert.

Beachten Sie, dass, wie auch von anderen berichtet, die Javascript-basierte Methode nicht funktioniert, wenn "Alle Zellen ausführen" ausgeführt wird (funktioniert aber, wenn Zellen "manuell" ausgeführt werden), was für mich ein Deal-Breaker war.

12
P.Toccaceli